Почему tuple (set ([1, «a», «b», «c», «z», «f»])) == tuple (set ([«a», «b», «c», «Z», «f», 1])) 85% времени с включенной рандомизацией хэша?


Ответы:


128

Я предполагаю, что любой читатель этого вопроса прочитал оба:

Первое, что следует отметить, это то, что рандомизация хэша определяется при запуске интерпретатора.

Хеш каждой буквы будет одинаковым для обоих наборов, поэтому единственное, что может иметь значение, - это наличие коллизии (где это повлияет на порядок).


Судя по выводам этой второй ссылки, мы знаем, что резервный массив для этих наборов начинается с длины 8:

_ _ _ _ _ _ _ _

В первом случае мы вставляем 1:

_ 1 _ _ _ _ _ _

а затем вставьте остальные:

α 1 ? ? ? ? ? ?

Затем его переделывают до размера 32:

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

Во втором случае вставляем остальные:

? β ? ? ? ? ? ?

А затем попробуйте вставить 1:

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

И тогда это будет перефразировано:

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

Таким образом, разные порядки итераций зависят исключительно от того, существует ли β.


Вероятность β - это шанс того, что любая из 5 букв будет хешировать до 1 по модулю 8 и хешировать до 1 по модулю 32.

Поскольку все, что хешируется до 1 по модулю 32, также хешируется до 1 по модулю 8, мы хотим найти вероятность того, что из 32 слотов один из пяти находится в слоте 1:

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

5/32 равно 0,15625, поэтому существует вероятность 15,625% того, что заказы будут разными в двух конструкциях набора .


Совсем не странно, это именно то, что измерил Нулевой Пирей.


¹Технически даже это не очевидно. Мы можем притвориться, что каждый из 5 хэшей уникален из-за повторного хеширования, но из-за линейного зондирования на самом деле более вероятно возникновение «сгруппированных» структур ... но поскольку мы смотрим только на то, занят ли один слот, это не на нас не влияет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.