Почему метод hash () возвращает короткое значение Hash с int в Python? - PullRequest
0 голосов
/ 07 ноября 2018

Когда в Python 3 вызывается метод hash(), я заметил, что он не возвращает длинное целое число, принимая тип данных int, но с типом string.

Это должно работать так? Если это действительно так, для типа int иметь короткое значение хеша, не вызовет ли он коллизию, так как он слишком короткий?

for i in [i for i in range(5)]:
    print(hash(i))

print(hash("abc"))

Результат:

0
1
2
3
4
4714025963994714141

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

В CPython, реализация интерпретатора Python по умолчанию, встроенная hash выполняется в таким образом :

Для числовых типов хеш числа x основан на сокращении x по модулю простого числа P = 2 ** _ PyHASH_BITS - 1. Он разработан таким образом, чтобы hash (x) == hash (y) всякий раз, когда x и y численно равны, даже если х и у имеют разные типы

_PyHASH_BITS - это 61 (64-разрядные системы) или 31 (32-разрядные системы) (здесь определено )

Итак, в 64-битной системе встроенная hash выглядит следующим образом:

def hash(number):
    return number % (2 ** 61 - 1)

Именно поэтому для небольших целых значений вы получаете одинаковые значения, в то время как, например, hash(2305843009213693950) возвращает 2305843009213693950 и hash(2305843009213693951) возвращает 0

0 голосов
/ 07 ноября 2018

Вы должны использовать модуль hashlib:

>>> import hashlib()
>>> m.update(b'abc')
>>> m.hexdigest()
0 голосов
/ 07 ноября 2018

Единственная цель функции hash - создать целочисленное значение, которое можно использовать для вставки объекта в dict. hash гарантирует только то, что если a == b, то hash(a) == hash(b). Для пользовательского класса Foo пользователь обязан обеспечить выполнение этой гарантии Foo.__eq__ и Foo.__hash__.

Все остальное зависит от реализации, и вы не должны ничего читать в значение hash(x) для любого значения x. В частности, hash(a) == hash(b) допускается для a != b, а hash(x) == x не требуется для любого конкретного x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...