2015-04-30 8 views
2

Мое понимание состоит в том, что хеширование двух разных фризонсет (неизменяемых наборов Python), которые должны содержать объекты хэширования, должно приводить к двум различным хешам. Почему я получаю выход ниже для двух разных фризонов?Различные фенизоны python с одинаковым значением хэша

In [11]: a 
Out[11]: frozenset({(2, -2), (2, -1), (3, -2), (3, -1)}) 

In [12]: b 
Out[12]: frozenset({(4, -2), (4, -1), (5, -2), (5, -1)}) 

In [13]: hash(a) 
Out[13]: 665780563440688 

In [14]: hash(b) 
Out[14]: 665780563440688 
+0

Я не знаю, какое отношение это, но: это не гарантирует, что два неравные значения будут иметь разные значения хэша (этого не может быть - существует гораздо больше, чем 2^64 возможных хешируемых значений), просто это необычно (и, надеюсь, не предсказуемо, потому что, если бы вы могли, например, DoS a сервер, предоставив ему кучу хеш-коллимирующих значений и превратив его dicts в линейное время вместо постоянного доступа). – abarnert

+0

@abarnert Я думаю, что ваш комментарий является «релевантным», чтобы быть ответом. – Shashank

+0

@Shashank: Ну, это зависит от того, как он просто наткнулся на один пример из миллиарда случайно или что-то еще странное происходит. Так или иначе, кто-то уже превратил это в ответ. – abarnert

ответ

3

Вы, похоже, наткнулись на два frozenset с равными хэш-кодов и различным содержанием. Это не так странно, поскольку может показаться, что свойство хеш-кодов состоит в том, что они гарантированно равны для равных объектов и, вероятно, отличаются для неравных объектов.

Из документов Python:

хэш (объект) -> целое

Возврат хеш-значение объекта. Два объекта с одинаковым значением имеют одинаковое значение хэш-функции. Обратное не обязательно верно, но вероятно.

Абсолютный самый простой пример этого являются числа -1 и -2, которые имеют один и тот же хэш-код в Python:

>>> print(hash(-1)) 
-2 
>>> print(hash(-2)) 
-2