如果Python,为什么-1
和-2
两者都哈希到相同的数字?
既然他们这样做,Python如何区分这两个数字?
>>> -1 is -2
False
>>> hash(-1) is hash(-2)
True
>>> hash(-1)
-2
>>> hash(-2)
-2
Run Code Online (Sandbox Code Playgroud) 我需要比较大块数据的相等性,我需要每秒快速比较多个数据.每个对象都保证大小相同,并且可能/可能只是略有不同(在未知位置).
我已经看到,从下面的交互式会话中,==
如果差异朝向字符串的末尾,则使用字符串字符串的运算符会更慢,并且如果在开始附近存在差异,则可以非常快.
我认为可能有某种方法可以使用某种哈希来加快速度,当然计算md5哈希值并且比较速度较慢,但是python的内置哈希确实可以显着提高速度.
但是,我不知道这个哈希的实现细节,它是否真的像哈希一样,我觉得很可能hash(a) == hash(b)
当时a == b
很可能?如果哈希冲突相当罕见,我很高兴有一些不正确的结果(在几个小时内需要一个200 PS3阵列才能发生冲突的情况很少见)
In [1]: import hashlib
In [2]: with open('/dev/urandom') as f:
...: spam = f.read(2**20 - 1)
...:
In [3]: spamA = spam + 'A'
In [4]: Aspam = 'A' + spam
In [5]: spamB = spam + 'B'
In [6]: timeit spamA == spamB
1000 loops, best of 3: 1.59 ms per loop
In [7]: timeit spamA == Aspam …
Run Code Online (Sandbox Code Playgroud) 我写了一个类,其.__hash__()
实现需要很长时间才能执行.我一直在考虑缓存它的哈希值,并将其存储在一个变量中,._hash
因此该.__hash__()
方法只会返回._hash
.(将.__init__()
在第一次或第一次结束时计算.__hash__()
.)
我的理由是:"这个对象是不可变的 - >它的哈希值永远不会改变 - >我可以缓存哈希值."
但现在让我思考:你可以对任何可清洗对象说同样的话.(除了散列为其id的对象外.)
那么有没有理由不缓存对象的哈希值,除了哈希计算速度非常快的小对象?
我的理解是散列需要包含可散列对象的两个不同的frozensets(不可变的Python 集)应该会导致两个不同的散列。为什么我会得到以下两个不同frozensets的输出?
In [11]: a
Out[11]: frozenset({(2, -2), (2, -1), (3, -2), (3, -1)})
In [12]: b
Out[12]: frozenset({(4, -2), (4, -1), (5, -2), (5, -1)})
In [13]: hash(a)
Out[13]: 665780563440688
In [14]: hash(b)
Out[14]: 665780563440688
Run Code Online (Sandbox Code Playgroud)