我想使自定义对象可哈希化(通过腌制)。我可以找到__hash__适用于Python 2.x的算法(请参见下面的代码),但是它显然 不同于 适用于Python 3.2的哈希(我想知道为什么吗?)。有人知道如何__hash__在Python 3.2中实现吗?
__hash__
#Version: Python 3.2 def c_mul(a, b): #C type multiplication return eval(hex((int(a) * b) & 0xFFFFFFFF)[:-1]) class hs: #Python 2.x algorithm for hash from http://effbot.org/zone/python-hash.htm def __hash__(self): if not self: return 0 # empty value = ord(self[0]) << 7 for char in self: value = c_mul(1000003, value) ^ ord(char) value = value ^ len(self) if value == -1: value = -2 return value def main(): s = ["PROBLEM", "PROBLEN", "PROBLEO", "PROBLEP"]#, "PROBLEQ", "PROBLER", "PROBLES"] print("Python 3.2 hash() bild-in") for c in s[:]: print("hash('", c, "')=", hex(hash(c)), end="\n") print("\n") print("Python 2.x type hash: __hash__()") for c in s[:]: print("hs.__hash__('", c, "')=", hex(hs.__hash__(c)), end="\n") if __name__ == "__main__": main()
OUTPUT: Python 3.2 hash() bild-in hash(' PROBLEM ')= 0x7a8e675a hash(' PROBLEN ')= 0x7a8e6759 hash(' PROBLEO ')= 0x7a8e6758 hash(' PROBLEP ')= 0x7a8e6747 Python 2.x type hash: __hash__() hs.__hash__(' PROBLEM ')= 0xa638a41 hs.__hash__(' PROBLEN ')= 0xa638a42 hs.__hash__(' PROBLEO ')= 0xa638a43 hs.__hash__(' PROBLEP ')= 0xa638a5c
它们为何不同的答案写在这里:
哈希值现在是一种新类型的值Py_hash_t,该值定义为与指针大小相同。以前它们是long型的,在某些64位操作系统上,它们仍然只有32位长。
哈希还考虑了要计算的新值,看看
sys.hash_info
对于字符串,您可以查看http://svn.python.org/view/python/trunk/Objects/stringobject.c?view=markup第1263行string_hash(PyStringObject * a)