如何将字符串散列成8位数字?

无论如何,我可以散列一个随机字符串到一个8位数字没有实现任何算法自己?

197830 次浏览

是的,您可以使用内置的 hashlib模块或内置的 hash函数。然后,使用模运算或对散列的整数形式进行字符串切片运算,切掉最后8个数字:

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


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


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

Raymond 的答案对 python2来说是很好的(尽管在10 * * 8左右不需要 abs ()和括号)。然而,对于 python3,有一些重要的警告。首先,您需要确保传递的是已编码的字符串。现在,在大多数情况下,最好避免使用 sha-1,而是使用诸如 sha-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

将只在给定的脚本运行中返回相同的值:

#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

因此,取决于这在您的应用程序中是否重要(在我的应用程序中是否重要) ,您可能希望坚持基于 hashlib 的方法。

为了完成 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

在 Python 3.10中,将字符串散列为8个十六进制数字摘要的另一种快速方法是使用 已消化物(4):

import hashlib
h=hashlib.shake_128(b"my ascii string").hexdigest(4)
#34c0150b

注意4而不是8,因为摘要的长度是作为参数给出的数字的两倍。

当然要注意散列冲突。