hash() возвращает разные значения в разных операционных системах

#python #python-2.7 #hash #python-internals

#python #python-2.7 #хэш #python-внутренности

Вопрос:

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

Windows:

 >>> hash('test')
1308370872
  

linux:

 >>> hash('test')
2314058222102390712
  

Почему это так?

Комментарии:

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

2. Вы ожидаете, что они вернут одинаковые значения? Почему? Выполняется hash("test") дважды в разных сеансах в одной и той же системе, каждый раз возвращает разные значения.

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

4. @donkopotamus нет

5. OP явно упомянул, что они используют Python 2.7.12. Таким образом, обман не имеет значения, поскольку речь идет о Python 3.3. Повторное открытие вопроса.

Ответ №1:

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

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

Комментарии:

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

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

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

4. hashlib полностью невосприимчив к «проблеме», поскольку он просто не заботится об адресе, хэш зависит от значения строки. То же самое для hash() .

5. Верно, но hash() не гарантируется, что он не зависит от платформы, а hashlib является.