【发布时间】:2015-11-08 20:51:24
【问题描述】:
出于好奇,我看到了在字符串域中将对象的 id 转换为其哈希的操作是什么样的,而不是使用通常的按位操作,如 ^、|、&、@987654324 @。
class A:
pass
def my_hash(a):
bits = format(id(a), '064b')
rot4 = bits[-4:] + bits[:-4]
n = int(rot4, 2)
return n
for _ in xrange(10):
a = A()
print hash(a) == my_hash(a), hash(a), my_hash(a)
但正如您在下面看到的,下面的函数有时不正确。我错过了什么?
>>> run /tmp/thing.py
True 272331835 272331835
False -9223372036582443978 9223372037127107638
True 272331835 272331835
False -9223372036582443978 9223372037127107638
True 272331835 272331835
False -9223372036582443978 9223372037127107638
True 272331835 272331835
False -9223372036582443978 9223372037127107638
True 272331835 272331835
False -9223372036582443978 9223372037127107638
【问题讨论】:
-
还有数字触发器,因为每次迭代 Python 都会重用刚刚释放的内存槽;
A()首先分配给内存位置 foo 并绑定到a,然后下一次迭代新的A()分配内存位置 bar,将其重新绑定到 @ 987654330@,此时 foo 上的旧实例被释放(引用计数降至 0,因为a不再引用它)。所以下一次迭代A()存储在位置foo,bar被释放,等等
标签: python hash bit-manipulation bit-shift