如何在Python 3.2中实现__hash__?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在Python 3.2中实现__hash__?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2377字,纯文字阅读大概需要4分钟。
内容图文
![如何在Python 3.2中实现__hash__?](/upload/InfoBanner/zyjiaocheng/801/d330fdf3b2ee47f1bf6e82b0e9a419e7.jpg)
我想使自定义对象可以哈希(通过酸洗).我可以找到Python 2.x的__hash__算法(参见下面的代码),但它明显不同于Python 3.2的哈希(我想知道为什么?).有谁知道在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
编辑:差异解释,对于Python 3.2“哈希值现在是新类型的值,Py_hash_t等……”
Edit2 @Pih谢谢[link] http://svn.python.org/view/python/trunk/Objects/stringobject.c?view=markup
static long
1263 string_hash(PyStringObject *a)
1264 {
1265 register Py_ssize_t len;
1266 register unsigned char *p;
1267 register long x;
1268
1269 if (a->ob_shash != -1)
1270 return a->ob_shash;
1271 len = Py_SIZE(a);
1272 p = (unsigned char *) a->ob_sval;
1273 x = *p << 7;
1274 while (--len >= 0)
1275 x = (1000003*x) ^ *p++;
1276 x ^= Py_SIZE(a);
1277 if (x == -1)
1278 x = -2;
1279 a->ob_shash = x;
1280 return x;
1281 }
解决方法:
在那里写下他们不同的答案:
Hash values are now values of a new
type, Py_hash_t, which is defined to
be the same size as a pointer.
Previously they were of type long,
which on some 64-bit operating systems
is still only 32 bits long.
散列还考虑要计算的新值,看一看
sys.hash_info
对于字符串,你可以看一下http://svn.python.org/view/python/trunk/Objects/stringobject.c?view=markup行1263 string_hash(PyStringObject * a)
内容总结
以上是互联网集市为您收集整理的如何在Python 3.2中实现__hash__?全部内容,希望文章能够帮你解决如何在Python 3.2中实现__hash__?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。