Чому кортеж (set ([1, "a", "b", "c", "z", "f"])) == кортеж (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% шансів¹, щоб замовлення відрізнялися між двома встановленими конструкціями .


Зовсім не дивно, саме це вимірював Нуль Пірей.


EvenТехнічно навіть це не очевидно. Ми можемо зробити вигляд, що кожен з 5-ти хешів унікально через повторне прошивання, але через лінійне зондування це насправді більше шансів на виникнення "згустованих" структур ... але тому, що ми дивимось лише на те, чи зайнятий один слот, це не насправді не впливає на нас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.