2016-10-12 3 views
0

Когда встроенный python hash() просто подключен к кросс-платформенной. У меня есть приложение, встроенное в hash() для 'test'. Обе системы являются 64-разрядные питона 2.7.12hash() возвращает разные значения для разных ОС

окна:

>>> hash('test') 
1308370872 

линукс:

>>> hash('test') 
2314058222102390712 

Почему это?

+0

при использовании hashlib, все в порядке. Есть ли какой-либо документ, ссылающийся на эту разницу? – wiwengweng

+1

Ожидаете ли вы, что они вернут те же значения? Зачем? Выполнение 'хэш (« тест »)' дважды в разных сеансах в одной и той же системе, каждый раз возвращает разные значения. – Evert

+1

Может быть, один питон 32bit, а другой 64-битный? Вы можете запустить python 32bit в 64-битной операционной системе –

ответ

1

Нет гарантий относительно значения hash возвращается в Python. Похоже, вы используете 32-битный Windows Python (это предположение), и вы используете 64-битный питон для Linux (опять же, предположение). IIRC (и я еще не проверял). Значение по умолчанию hash(item) возвращает адрес item в качестве значения хеша.

Если вы хотите иметь значения, которые вы можете сравнить в разных операционных системах, посмотрите на hashlib.

+0

Я просто перечитал вопрос; 'hash (item)', возвращающий адрес 'item', может возвращать совершенно разные значения между различными прогонками на одной платформе, а тем более на разных, независимо от 32/64-разрядных проблем. – cco

+0

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

+0

Да. Python предлагает много преимуществ, интерполируя строки прозрачно, поэтому 'hash ('foo')' может быть либо одинаковым, либо отличным от 'xx = 'foo'; хэш (хх) '. 'hashlib' имеет решения для этой проблемы. – cco