Подтвердить что ты не робот

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

Учитывая ответ Zero Piraeus на другой вопрос, мы имеем, что

x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)

Печать True около 85% времени с хеш-рандомизация включена. Почему 85%?

4b9b3361

Ответ 1

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

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

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


По выводам этой второй ссылки мы знаем, что массив поддержки для этих множеств начинается с длины 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,155625, поэтому существует вероятность 15.625% 1 порядков, отличающихся друг от друга между двумя конструкциями.


Не очень странно, это точно то, что измерил Zero Piraeus.


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