Perché tuple (set ([1, "a", "b", "c", "z", "f"])) == tuple (set (["a", "b", "c", "Z", "f", 1])) 85% delle volte con la randomizzazione hash abilitata?


Risposte:


128

Presumo che tutti i lettori di questa domanda abbiano letto entrambi:

La prima cosa da notare è che la randomizzazione dell'hash viene decisa all'avvio dell'interprete.

L'hash di ogni lettera sarà lo stesso per entrambi i set, quindi l'unica cosa che può importare è se c'è una collisione (dove l'ordine sarà influenzato).


Dalle deduzioni di quel secondo collegamento sappiamo che l'array di supporto per questi set inizia alla lunghezza 8:

_ _ _ _ _ _ _ _

Nel primo caso inseriamo 1:

_ 1 _ _ _ _ _ _

e poi inserisci il resto:

α 1 ? ? ? ? ? ?

Quindi viene modificato alla dimensione 32:

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

Nel secondo caso, inseriamo il resto:

? β ? ? ? ? ? ?

E poi prova a inserire 1:

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

E poi sarà rimescolato:

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

Quindi se gli ordini di iterazione sono diversi dipende esclusivamente dall'esistenza di β.


La possibilità di un β è la possibilità che una qualsiasi delle 5 lettere abbia hash a 1 modulo 8 e hash a 1 modulo 32.

Poiché tutto ciò che ha un hash a 1 modulo 32 ha anche un hash a 1 modulo 8, vogliamo trovare la possibilità che dei 32 slot, uno dei cinque sia nello slot 1:

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

5/32 è 0,15625, quindi c'è una probabilità del 15,625 %¹ che gli ordini siano diversi tra le due costruzioni dell'insieme .


Non molto stranamente, questo è esattamente ciò che ha misurato Zero Pireo.


¹Tecnicamente anche questo non è ovvio. Possiamo fingere ognuno dei 5 hash in modo univoco a causa del rehashing, ma a causa del sondaggio lineare è effettivamente più probabile che si verifichino strutture "raggruppate" ... ma poiché stiamo solo esaminando se un singolo slot è occupato, questo non in realtà ci influenzano.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.