Враховуючи відповідь Нуля Пірея на інше питання , ми маємо це
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
Друкує True
близько 85% часу з увімкненою рандомізацією хешу . Чому 85%?
Враховуючи відповідь Нуля Пірея на інше питання , ми маємо це
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
Друкує True
близько 85% часу з увімкненою рандомізацією хешу . Чому 85%?
Відповіді:
Я збираюся припустити, що будь-які читачі цього питання читали обидва:
Перше, що слід зазначити, це те, що рандомізація хешу визначається при запуску перекладача.
Хеш для кожної літери буде однаковим для обох наборів, тому єдине, що може мати значення, - це якщо зіткнеться (де буде порушено порядок).
За відрахуванням цього другого посилання ми знаємо, що резервний масив для цих наборів починається з довжини 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-ти хешів унікально через повторне прошивання, але через лінійне зондування це насправді більше шансів на виникнення "згустованих" структур ... але тому, що ми дивимось лише на те, чи зайнятий один слот, це не насправді не впливає на нас.