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?