web-dev-qa-db-fra.com

Pourquoi Tuple (set ([1, "a", "b", "c", "z", "f"])) == Tuple (set (["a", "b", "c", "z", "f", 1])) 85% du temps avec la randomisation du hachage activée?

Étant donné la réponse de Zero Piraeus à une autre question , nous avons cela

x = Tuple(set([1, "a", "b", "c", "z", "f"]))
y = Tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)

Imprime True environ 85% du temps avec randomisation du hachage activé. Pourquoi 85%?

97
Veedrac

Je vais supposer que tous les lecteurs de cette question auront lu les deux:

La première chose à noter est que la randomisation du hachage est décidée au démarrage de l'interpréteur.

Le hachage de chaque lettre sera le même pour les deux ensembles, donc la seule chose qui peut être importante est s'il y a une collision (où l'ordre sera affecté).


Par les déductions de ce deuxième lien, nous savons que le tableau de support pour ces ensembles commence à la longueur 8:

_ _ _ _ _ _ _ _

Dans le premier cas, nous insérons 1:

_ 1 _ _ _ _ _ _

puis insérez le reste:

α 1 ? ? ? ? ? ?

Ensuite, il est remanié à la taille 32:

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

Dans le deuxième cas, nous insérons le reste:

? β ? ? ? ? ? ?

Et puis essayez d'insérer 1:

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

Et puis il sera refait:

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

Donc, si les ordres d'itération sont différents, cela dépend uniquement de l'existence de β.


La chance d'un β est la chance que l'une des 5 lettres soit hachée à 1 modulo 8 et hachée à 1 modulo 32.

Puisque tout ce qui hache à 1 modulo 32 hache aussi à 1 modulo 8, nous voulons trouver la chance que des 32 emplacements, l'un des cinq se trouve dans l'emplacement 1:

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

5/32 est 0,15625, donc il y a 15,625% de chances¹ que les ordres soient différents entre les deux constructions d'ensemble .


Pas très étrangement du tout, c'est exactement ce que Zero Piraeus a mesuré.


¹ Techniquement, même cela n'est pas évident. Nous pouvons prétendre que chacun des 5 hachages est uniquement dû au ressassement, mais à cause du sondage linéaire, il est en fait plus probable que des structures "groupées" se produisent ... mais parce que nous ne cherchons qu'à savoir si un seul emplacement est occupé, cela ne ne nous affecte pas vraiment.

128
Veedrac