如何将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
答案 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的构建一样好,并且您可以完全控制跨平台的结果。