Учитывая ответ 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%?
Учитывая ответ 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%?
Я собираюсь предположить, что читатели этого вопроса читают оба:
Прежде всего следует отметить, что хеш-рандомизация определяется при запуске интерпретатора.
Хэш каждой буквы будет одинаковым для обоих наборов, поэтому единственное, что может иметь значение, - это если есть столкновение (где порядок будет затронут).
По выводам этой второй ссылки мы знаем, что массив поддержки для этих множеств начинается с длины 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 хэшей уникален из-за перефразирования, но из-за линейного исследования это скорее более вероятно для "сгруппированных" структур... но потому что мы смотрим только на то, занят ли один слот, это не делает Фактически это влияет на нас.