Ich arbeite derzeit an einer Sammlung Bibliothek für meine benutzerdefinierte Programmiersprache. Ich habe bereits mehrere Datentypen (Collection, List, Map, Set) und Implementierungen für sie (veränderbar und unveränderlich), aber was ich bisher vermisst habe, war und equals
. Während dies für Listen keine Probleme sind, da sie geordnete Sammlungen sind, spielen sie für Sets und Maps eine besondere Rolle. Zwei Sätze werden als gleich betrachtet, wenn sie die gleiche Größe und die gleichen Elemente haben, und die Reihenfolge, in der die Sätze sie beibehalten, sollte keinen Unterschied in ihrer Gleichheit machen. Aufgrund des equals-hashCode-Vertrags muss die hashCode
-Implementierung auch dieses Verhalten widerspiegeln, was bedeutet, dass zwei Sätze mit denselben Elementen, aber unterschiedlicher Reihenfolge denselben Hash-Code haben sollten. (Dies gilt auch für Karten, die technisch eine Reihe von Key-Value-Paaren)Order-unabhängige Hash-Algorithmus
Beispiel (Pseudocode):
let set1: Set<String> = [ "a", "b", "c" ]
let set2: Set<String> = [ "b", "c", "a" ]
set1 == set2 // should return true
set1.hashCode == set2.hashCode // should also return true
Wie würde ich einen einigermaßen guten Hash-Algorithmus implementieren, für die die hashCode
s im obigen Beispiel geben Sie den gleichen Wert zurück?
Wie wäre es ein Paar (Summe, Produkt) der Begriffe in der Menge? Beides zusammen wäre für verschiedene Zahlensätze nicht üblich (soweit ich gesehen habe). –
Zum Beispiel so etwas wie '(e1.hashCode() + e2.hashCode() + ... + de.hashCode())^(e1.hashCode() * e2.hashCode() * ... * de.hashCode()) '? – Clashsoft
Haben Sie versucht zu sehen, wie Java das implementiert? – RealSkeptic