Pourquoi tuple (set ([1, “a”, “b”, “c”, “z”, “f”])) == tuple (set ([“a”, “b”, “c”, «Z», «f», 1])) 85% du temps avec la randomisation de hachage activée?

Réponses:

128

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

La première chose à noter est que la randomisation de 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 compter 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, on insère 1:

_ 1 _ _ _ _ _ _

puis insérez le reste:

α 1 ? ? ? ? ? ?

Ensuite, il est remis en taille 32:

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

Dans le second cas, on insère le reste:

? β ? ? ? ? ? ?

Et puis essayez d'insérer 1:

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

Et puis il sera ressuscité:

    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 sur 1 modulo 8 et hachée sur 1 modulo 32.

Puisque tout ce qui hache à 1 modulo 32 hache également à 1 modulo 8, nous voulons trouver la chance que sur les 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 étrange 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 unique à cause du 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 regardons que si un seul emplacement est occupé, cela ne ne nous affecte pas vraiment.

Veedrac
la source