2017-09-04 11 views
0

Je travaille actuellement sur un type de données graphique, et dans ce contexte j'ai beaucoup réfléchi aux problèmes sémantiques concernant l'identité et l'égalité.L'égalité doit-elle impliquer des valeurs de hachage égales?

Ma situation est maintenant la suivante. J'ai un type Vertex:

final class Vertex<T>: Hashable { 

    static func ==(lhs: Vertex, rhs: Vertex) -> Bool { 
    return lhs === rhs 
    } 

    var value: T 

    var hashValue: Int { 
    return ObjectIdentifier(self).hashValue 
    } 

} 

Comme vous pouvez le voir l'égalité est déterminée par l'identité. Je l'ai fait pour des raisons spécifiques au type de données du graphique, mais ce qui revient essentiellement au fait que les sommets doivent être visualisés par leur identité et donc seulement considérés comme égaux s'ils sont identiques (identique) vertex .

Maintenant, la valeur de hachage est également déterminée par identité (en utilisant ObjectIdentifier). Cela semblait être le moyen le plus facile d'obtenir une valeur de hachage, et semblait également s'harmoniser bien avec la conception de l'égalité pour ce type.

Mais cela me fait penser ...
Serait-il sémantiquement « incorrect » (ou illogique si vous voulez) pour déterminer la valeur de hachage par, disons, la propriété value (si T à Hashable conformez).
Dans ce cas, deux Vertex peuvent avoir des valeurs de hachage égales de manière cohérente (pas seulement pour une invocation du programme), sans être considérées comme égales. Et cela ne semble pas juste. Donc, à son tour: Est-il raisonnable de dire que l'égalité des instances devrait impliquer l'égalité de leurs valeurs de hachage?

Répondre

2

De la documentation Hashable:

« Une valeur de hachage, fournie par la propriété valeur de hachage d'un type, est un entier qui est le même pour c'est des deux cas qui comparent également, deux cas a. et b du même type, si a == b alors a.hashValue == b.hashValue L'inverse n'est pas vrai: deux instances avec des valeurs de hachage égales ne sont pas nécessairement égales les unes aux autres. "

En d'autres termes, si == retours true, hashValue doit retourner la même valeur pour les deux objets.

1

Les exigences pour le hachage sont que si deux valeurs a et b sont les mêmes que a.hashvalue == b.hashvalue. Cependant, cela ne signifie pas que l'inverse est vrai. Si deux valeurs de hachage sont identiques, il est possible que les éléments hachés ne soient pas identiques. Donc, quand vous dites que

  • "l'égalité des instances devrait impliquer l'égalité de leurs valeurs de hachage?" C'est en fait une exigence.
  • "deux Vertexs peuvent avoir des valeurs de hachage égales de manière cohérente (pas seulement pour une invocation du programme), sans être considérées comme égales, et cela ne semble pas correct" - en fait, cela est possible.