Warum tuple(set([1,"a","b","c","z","f"])) == tuple(set(["a","b","c","z","f",1])) 85% der Zeit mit hash-randomization aktiviert?
Angesichts Null Piräus Antwort auf eine andere Frage, die wir haben, dass
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
Drucke True
etwa 85% der Zeit mit hash-Randomisierung aktiviert. Warum 85%?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich werde davon ausgehen, dass jeder Leser diese Frage gelesen zu haben das beide:
Null Piräus Antwort und
Meine Erklärung, in der CPython-Wörterbücher.
Das erste, was zu beachten ist, dass die hash-Randomisierung entschieden wird, auf Dolmetscher-start-up.
Den hash-Wert von jedem Buchstaben die gleiche für beide Gruppen, also die einzige Sache, die Sache ist, wenn es zu einer Kollision (wo bestellen betroffen sein wird).
Durch den Abzug der zweite link, den wir kennen, der backing-array für diese Gruppen beginnt bei Länge 8:
Im ersten Fall setzen wir
1
:und fügen Sie dann den rest:
Dann ist es aufgewärmt Größe 32:
Im zweiten Fall fügen wir den rest:
Und dann versuchen zu insert 1:
Und dann wird es aufgewärmt:
Also, ob die iteration Aufträge sind unterschiedlich, hängt allein davon ab, ob β existiert.
Die chance auf eine β ist die Wahrscheinlichkeit, dass jeder der 5 Buchstaben hash zu 1 modulo 8 und hash zu 1 modulo 32.
Da nichts, die hashes zu 1 modulo-32-hashes zu 1 modulo 8, die wir finden wollen, die chance, dass der 32-slots, einer der fünf ist in Steckplatz 1:
5/32 ist 0.15625, so es ist ein 15.625% chance1 der Aufträge unterscheidet sich zwischen den beiden set-Bauten.
Nicht sehr seltsam, denn das ist genau das, was Zero Piräus gemessen.
1Technically auch dies ist nicht offensichtlich. Wir können behaupten, jeder der 5 hashes eindeutig, weil der Aufbereitung, aber wegen des linearen Sondieren ist es eigentlich eher für "gebündelt" - Strukturen auftreten... aber da sind wir nur geschaut, ob ein single-slot belegt ist, dieser nicht wirklich auf uns wirken.