Python冻结集的持久散列

你如何将Python的frozenset对象的嵌套转换成Python对话和平台中相同的唯一整数?

例如,我在不同的平台上从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 

你如何将Python的frozenset对象的嵌套转换成Python对话和平台中相同的唯一整数?

AFAIK哈希不保证是唯一的。 事实上,它们用于查找表(就像在字典中),散列冲突是相当普遍的。

那就说。 如果你想要一个跨平台的一致的,非唯一的“散列”,我会尝试使用标准库hashlib 。 我没有可能在不同的平台上尝试它,但是我相信在那里实现的大多数算法(例如MD5之一)是平台无关的。

我会用散列集合的散列版本来提供散列算法,以确保用于散列的字符串总是相同的。


编辑:想添加一个基本的例子:

 >>> 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 

你也可以创建你自己的散列函数:

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

这不一定是唯一的,但是它和集合散列一样好,你可以完全控制跨平台的结果。