【问题标题】:Generate ID from string in Python在 Python 中从字符串生成 ID
【发布时间】:2014-05-23 08:39:13
【问题描述】:

在 Python 中为给定的 string 生成 integer 类型的 ID 有点困难。

我认为内置的hash 功能很完美,但有时ID 似乎太长了。这是一个问题,因为我的最大长度限制为 64 位。

到目前为止我的代码:hash(s) % 10000000000。 我可以预期的输入字符串的长度范围为 12-512 个字符。

要求是:

  • 仅限整数
  • 从提供的字符串生成
  • 理想情况下最长为 10-12 个字符(我将只有大约 500 万个项目)
  • 碰撞概率低..?

如果有人可以提供任何提示/解决方案,我会很高兴。

【问题讨论】:

    标签: python hash


    【解决方案1】:

    我会这样做:

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

    想法:

    1. 用 MD5(或 SHA-1 或 ...)以十六进制形式计算字符串的哈希值(参见模块 hashlib
    2. 将字符串转换为整数,然后将其重新转换为以 10 为底的字符串(结果中只有数字)
    3. 使用字符串的前 12 个字符。

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

    【讨论】:

    • 谢谢,看起来很棒!它不返回整数,而只是将其转换回 int。如果我们可以摆脱 int/str/int coerce dance,那就太好了。任何想法? :)
    • m.hexdigit() 提供一个包含 32 个字符的字符串。所以最大值是'f'*32 39 位(=len(str(int('f'*32,16))))。所以你最后可以除以1E17。有了这个解决方案,碰撞可能更有可能......但我没有考虑过......
    • m.hexdigit() 提供m.digest_size * 2 字符(这可能会改变,具体取决于您要使用的哈希函数)
    • 注意:您也可以使用字符串digest(),从中切出足够多的字节并将其转换为整数(最好说:将字节字符串解释为整数)
    【解决方案2】:

    如果不允许添加额外的依赖,可以继续使用hash函数,方法如下:

    >>> my_string = "whatever"
    >>> str(hash(my_string))[1:13]
    '460440266319'
    

    注意:

    • 我忽略了第一个字符,因为它可能是负号。
    • hash 可能会为同一字符串返回不同的值,因为 PYTHONHASHSEED 每次运行程序时值都会改变。您可能希望将其设置为某个固定值。 Read here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多