#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 является.