Есть ли в любом случае, что я могу хэш случайной строки в 8-разрядное число без каких-либо алгоритмов? Спасибо.
Python: как хэш строку на 8 цифр?
Ответ 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