¿Por qué tuple (set ([1, "a", "b", "c", "z", "f"])) == tuple (set (["a", "b", "c", “Z”, “f”, 1])) ¿85% del tiempo con la aleatorización hash habilitada?

Respuestas:

128

Asumiré que cualquier lector de esta pregunta habrá leído ambos:

Lo primero que hay que tener en cuenta es que la aleatorización de hash se decide al iniciar el intérprete.

El hash de cada letra será el mismo para ambos conjuntos, por lo que lo único que puede importar es si hay una colisión (donde el orden se verá afectado).


Por las deducciones de ese segundo enlace, sabemos que la matriz de respaldo para estos conjuntos comienza en la longitud 8:

_ _ _ _ _ _ _ _

En el primer caso, insertamos 1:

_ 1 _ _ _ _ _ _

y luego inserte el resto:

α 1 ? ? ? ? ? ?

Luego se vuelve a modificar al tamaño 32:

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

En el segundo caso, insertamos el resto:

? β ? ? ? ? ? ?

Y luego intente insertar 1:

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

Y luego se repetirá:

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

Entonces, si los órdenes de iteración son diferentes depende únicamente de si existe β.


La posibilidad de un β es la posibilidad de que cualquiera de las 5 letras se convierta en 1 módulo 8 y en 1 módulo 32.

Dado que todo lo que tiene hash a 1 módulo 32 también lo hace a 1 módulo 8, queremos encontrar la posibilidad de que de las 32 ranuras, una de las cinco esté en la ranura 1:

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

5/32 es 0.15625, por lo que hay un 15.625% de probabilidad¹ de que los órdenes sean diferentes entre las dos construcciones de conjuntos .


No es muy extraño en absoluto, esto es exactamente lo que midió Zero Piraeus.


¹Técnicamente, incluso esto no es obvio. Podemos fingir que cada uno de los 5 hashes de forma única debido al refrito, pero debido al sondeo lineal es más probable que ocurran estructuras "agrupadas" ... pero como solo estamos viendo si un solo espacio está ocupado, esto no en realidad no nos afecta.

Veedrac
fuente