Python中字符串的持久散列

Cer*_*rin 22 python

如何将任意字符串转换为唯一的整数,这在Python会话和平台上是相同的?例如hash('my string'),因为为每个Python会话和平台返回不同的值,所以不起作用.

Ign*_*ams 32

使用哈希算法,如MD5或SHA1,然后转换hexdigest通道int():

>>> import hashlib
>>> int(hashlib.md5('Hello, world!').hexdigest(), 16)
144653930895353261282233826065192032313L
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但从技术上讲,生成的整数不是*唯一*.MD5哈希值比可用字符串少.但是,碰撞的可能性非常低 (6认同)
  • 任何哈希方法都是这种情况. (4认同)
  • 轻微修改:如果你想约束int的大小:`int(hashlib.md5('Hello,world!').hexdigest()[:8],16)`将是<2**32,`int (hashlib.md5('Hello,world!').hexdigest()[:16],16)`将<2**64. (3认同)
  • 如果出现“TypeError: Unicode-objects must be generated before hashing”,则需要对字符串进行编码,例如:“int(hashlib.md5('Hello, world!'.encode('utf-8')).hexdigest” (), 16)` (3认同)

Jas*_*ram 8

如果散列函数确实不适合您,您可以将字符串转换为数字.

my_string = 'my string'
def string_to_int(s):
    ord3 = lambda x : '%.3d' % ord(x)
    return int(''.join(map(ord3, s)))

In[10]: string_to_int(my_string)
Out[11]: 109121032115116114105110103L
Run Code Online (Sandbox Code Playgroud)

通过映射每个三元组,这是可逆的chr.

def int_to_string(n)
    s = str(n)
    return ''.join([chr(int(s[i:i+3])) for i in range(0, len(s), 3)])

In[12]: int_to_string(109121032115116114105110103L)
Out[13]: 'my string'
Run Code Online (Sandbox Code Playgroud)

  • 这将'\ 0'和'\ 0\0'映射到同一个东西 - 你应该添加一个'1'.这也是有点低效,可以使用十六进制表示,因此你有更小的数字(这相当于使用字符串的二进制表示并将其解释为数字). (5认同)