Python冻结集的持久散列

时间:2011-12-26 23:08:36

标签: python linux

如何将Python冷冻集对象的嵌套转换为Python会话和平台上相同的唯一整数?

e.g。我从不同平台上的hash()获得不同的值

32位

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=frozenset([frozenset([1,2,3]),frozenset(['a','b','c'])]);
>>> hash(a)
1555175235

64位

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=frozenset([frozenset([1,2,3]),frozenset(['a','b','c'])]);
>>> hash(a)
-6076998737938213053

2 个答案:

答案 0 :(得分:8)

  

如何将Python冷冻集对象的嵌套转换为Python会话和平台上相同的唯一整数?

AFAIK哈希不保证是唯一的。实际上,它们用于查找表(如字典中)哈希冲突很常见。

那就是说。如果您想在平台上使用一致的,非唯一的“哈希”,我会尝试使用标准库hashlib。我没有可能在不同的平台上尝试它,但我相信那里实现的大多数算法(例如MD5)都是独立于平台的。

我会使用散列集的pickled版本提供散列算法,以确保用于散列的字符串始终相同。


编辑:考虑添加一个基本示例:

>>> import cPickle as pkl
>>> import hashlib as hl
>>> s = frozenset([1,2,3])
>>> p = pkl.dumps(sorted(s))  #make sure you use the same pickle protocol on all platform!
'(lp1\nI1\naI2\naI3\na.'
>>> h = hl.md5(p)
<md5 HASH object @ 0xb76fb110>
>>> h.digest()
"\x89\xaeG\x1d'\x83\xa5\xbd\xac\xa7\x1c\xd9\x1d/2t"  #this should be consistent

答案 1 :(得分:0)

您还可以创建自己的哈希函数:

def hash(fs):
    res = 1
    for v in fs:
        res = (res*31 + v) % 2**30
    return res

这不一定是唯一的,但它与set hash的构建一样好,并且您可以完全控制跨平台的结果。