Warum Tupel (set ([1, "a", "b", "c", "z", "f"]) == Tupel (set (["a", "b", "c", "Z", "f", 1])) 85% der Zeit mit aktivierter Hash-Randomisierung?

Antworten:

128

Ich gehe davon aus, dass alle Leser dieser Frage beide gelesen haben:

Das erste, was zu beachten ist, ist, dass die Hash-Randomisierung beim Start des Interpreters entschieden wird.

Der Hash jedes Buchstabens ist für beide Sätze gleich. Das Einzige, was von Bedeutung sein kann, ist, ob es zu einer Kollision kommt (wo die Reihenfolge beeinflusst wird).


Durch die Abzüge dieses zweiten Links wissen wir, dass das Hintergrundarray für diese Sätze bei Länge 8 beginnt:

_ _ _ _ _ _ _ _

Im ersten Fall fügen wir ein 1:

_ 1 _ _ _ _ _ _

und dann den Rest einfügen:

α 1 ? ? ? ? ? ?

Dann wird es auf Größe 32 aufgewärmt:

    1 can't collide with α as α is an even hash
  ↓ so 1 is inserted at slot 1 first
? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Im zweiten Fall fügen wir den Rest ein:

? β ? ? ? ? ? ?

Und dann versuchen Sie 1 einzufügen:

    Try to insert 1 here, but will
  ↓ be rehashed if β exists
? β ? ? ? ? ? ?

Und dann wird es wieder aufgewärmt:

    Try to insert 1 here, but will
    be rehashed if β exists and has
  ↓ not rehashed somewhere else
? β ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Ob die Iterationsreihenfolgen unterschiedlich sind, hängt also nur davon ab, ob β existiert.


Die Chance eines β ist die Chance, dass einer der 5 Buchstaben auf 1 Modulo 8 und auf 1 Modulo 32 hasht.

Da alles, was mit 1 Modulo 32 hasht, auch mit 1 Modulo 8 hasht, möchten wir die Chance finden, dass sich von den 32 Slots einer der fünf in Slot 1 befindet:

5 (number of letters) / 32 (number of slots)

5/32 ist 0,15625, daher besteht eine Wahrscheinlichkeit von 15,625 %¹, dass die Ordnungen zwischen den beiden Mengenkonstruktionen unterschiedlich sind .


Überhaupt nicht sehr seltsam, genau das hat Zero Piraeus gemessen.


¹Technisch ist auch dies nicht offensichtlich. Wir können vorgeben, dass jeder der 5 Hashes aufgrund des erneuten Aufwärmens eindeutig ist, aber aufgrund der linearen Prüfung ist es tatsächlich wahrscheinlicher, dass "gebündelte" Strukturen auftreten ... aber weil wir nur prüfen, ob ein einzelner Slot belegt ist, ist dies nicht der Fall betrifft uns eigentlich nicht.

Veedrac
quelle