无论如何,我可以散列一个随机字符串到一个8位数字没有实现任何算法自己?
是的,您可以使用内置的 hashlib模块或内置的 hash函数。然后,使用模运算或对散列的整数形式进行字符串切片运算,切掉最后8个数字:
hashlib
hash
>>> 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,因为摘要的长度是作为参数给出的数字的两倍。
当然要注意散列冲突。