Подтвердить что ты не робот

Python: как хэш строку на 8 цифр?

Есть ли в любом случае, что я могу хэш случайной строки в 8-разрядное число без каких-либо алгоритмов? Спасибо.

4b9b3361

Ответ 1

Да, вы можете использовать встроенный модуль hashlib или встроенный hash. Затем отбросьте последние восемь цифр, используя операции модуляции или операции нарезания строк в целочисленной форме хэша:

>>> s = 'she sells sea shells by the sea shore'

>>> # Use hashlib
>>> import hashlib
>>> int(hashlib.sha1(s).hexdigest(), 16) % (10 ** 8)
58097614L

>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974

Ответ 2

Ответ Raymond отлично подходит для python2 (хотя вам не нужен abs(), а не parens около 10 ** 8). Однако для python3 существуют важные оговорки. Во-первых, вам нужно убедиться, что вы передаете закодированную строку. В наши дни, в большинстве случаев, вероятно, лучше уклониться от ша-1 и вместо этого использовать что-то вроде ша-256. Таким образом, подход hashlib будет:

>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417

Если вы хотите использовать функцию hash() вместо этого, важно остерегаться того, что в отличие от Python 2.x в Python 3.x результат hash() будет согласован только в процессе, а не через вызовы python. См. Здесь:

$ python -V
Python 2.7.5
$ python -c 'print(hash("foo"))'
-4177197833195190597
$ python -c 'print(hash("foo"))'
-4177197833195190597

$ python3 -V
Python 3.4.2
$ python3 -c 'print(hash("foo"))'
5790391865899772265
$ python3 -c 'print(hash("foo"))'
-8152690834165248934

Это означает, что предложенное решение hash() может быть сокращено до:

hash(s) % 10**8

возвращает только одно значение в заданном script запуске:

#Python 2:
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543

#Python 3:
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
12954124
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
32065451

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

Ответ 3

Для завершения ответа JJC в python 3.5.3 поведение правильное, если вы используете hashlib следующим образом:

$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded
$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded

$ python3 -V
Python 3.5.3