在Python中从字符串生成ID

14 投票
3 回答
29303 浏览
提问于 2025-04-18 02:06

我在用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库。

17

我会这样做:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("some string")
>>> str(int(m.hexdigest(), 16))[0:12]
'120665287271'

这个想法:

  1. 用MD5(或者SHA-1等)计算一个字符串的哈希值,结果是十六进制的形式(可以参考hashlib模块)
  2. 把这个字符串转换成一个整数,然后再把它转换回十进制的字符串(结果里只有数字)
  3. 取这个字符串的前12个字符。

如果字符a-f也可以的话,我会用m.hexdigest()[0:12]

撰写回答