Ich arbeite gerade an einem Graph-Datentyp, und in diesem Kontext habe ich viel über semantische Probleme bezüglich Identität und Gleichheit nachgedacht.Sollte Gleichheit gleiche Hashwerte implizieren?
Meine Situation ist jetzt das folgende. Ich habe einen Vertex
Typ:
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
}
}
Wie Sie Gleichheit von Identität bestimmt wird, sehen. Ich habe dies aus Gründen getan, die für den Graph-Datentyp spezifisch sind, aber was im Grunde genommen darauf hinausläuft, ist die Tatsache, dass Scheitelpunkte anhand ihrer Identität betrachtet und daher nur dann als gleich angesehen werden, wenn sie identisch sind (identischer) Scheitelpunkt .
Jetzt wird der Hash-Wert auch durch die Identität bestimmt (unter Verwendung der ObjectIdentifier
). Dies schien der einfachste Weg zu sein, einen Hash-Wert zu erhalten, und schien auch gut mit dem Konzept der Gleichheit für diesen Typ übereinzustimmen.
Aber das hat mir denken ...
Wäre es semantisch „falsch“ (oder unlogisch, wenn man so will) durch den Hash-Wert zu bestimmen, sagen wir mal, die value
Eigenschaft (wenn T
-Hashable
angepasst).
In diesem Fall könnten zwei Vertex
s konsistent gleiche Hash-Werte haben (nicht nur für einen Aufruf des Programms), ohne als gleich angesehen zu werden. Und das scheint nicht richtig zu sein.
Also wiederum: Ist es vernünftig zu sagen, dass die Gleichheit der Instanzen Gleichheit ihrer Hash-Werte implizieren sollte?