在Python中从字符串生成ID
我在用Python生成一个类型为integer
的ID,目的是从给定的string
中得到这个ID,遇到了一些困难。
我原以为内置的hash
函数很完美,但发现生成的ID有时候太长了。这对我来说是个问题,因为我最多只能用64位的长度。
到目前为止,我的代码是:hash(s) % 10000000000
。我预计输入的字符串长度会在12到512个字符之间。
我的要求是:
- 只要整数
- 必须是从提供的字符串生成的
- 最好长度在10到12个字符之间(我大概只有500万个项目)
- 碰撞的概率要低一些……?
如果有人能提供一些建议或解决方案,我会非常感激。
3 个回答
1
如果你不能添加额外的依赖库,可以继续使用 hash
函数,方法如下:
>>> my_string = "whatever"
>>> str(hash(my_string))[1:13]
'460440266319'
注意:
- 我忽略了第一个字符,因为它可能是负号。
hash
函数对于相同的字符串可能会返回不同的值,因为每次运行程序时,PYTHONHASHSEED
的值都会改变。你可能想把它设置为一个固定的值。点击这里了解更多
2
为了让我的代码正常工作,需要使用utf-8编码:
def unique_name_from_str(string: str, last_idx: int = 12) -> str:
"""
Generates a unique id name
refs:
- md5: https://stackoverflow.com/questions/22974499/generate-id-from-string-in-python
- sha3: https://stackoverflow.com/questions/47601592/safest-way-to-generate-a-unique-hash
(- guid/uiid: https://stackoverflow.com/questions/534839/how-to-create-a-guid-uuid-in-python?noredirect=1&lq=1)
"""
import hashlib
m = hashlib.md5()
string = string.encode('utf-8')
m.update(string)
unqiue_name: str = str(int(m.hexdigest(), 16))[0:last_idx]
return unqiue_name
可以看看我的ultimate-utils这个Python库。