相关疑难解决方法(0)

为什么-1和-2都在CPython中哈希到-2?

可能重复:
何时计算python对象的哈希值,为什么-1的哈希值不同?

如果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)

python hash cpython

36
推荐指数
1
解决办法
2001
查看次数

这是python的内置哈希函数的恰当使用吗?

我需要比较大块数据的相等性,我需要每秒快速比较多个数据.每个对象都保证大小相同,并且可能/可能只是略有不同(在未知位置).

我已经看到,从下面的交互式会话中,==如果差异朝向字符串的末尾,则使用字符串字符串的运算符会更慢,并且如果在开始附近存在差异,则可以非常快.

我认为可能有某种方法可以使用某种哈希来加快速度,当然计算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)

python hash hash-collision

15
推荐指数
1
解决办法
6532
查看次数

Python:有没有理由*不*缓存对象的哈希?

我写了一个类,其.__hash__()实现需要很长时间才能执行.我一直在考虑缓存它的哈希值,并将其存储在一个变量中,._hash因此该.__hash__()方法只会返回._hash.(将.__init__()在第一次或第一次结束时计算.__hash__().)

我的理由是:"这个对象是不可变的 - >它的哈希值永远不会改变 - >我可以缓存哈希值."

但现在让我思考:你可以对任何可清洗对象说同样的话.(除了散列为其id的对象外.)

那么有没有理由缓存对象的哈希值,除了哈希计算速度非常快的小对象?

python hash caching

12
推荐指数
1
解决办法
1270
查看次数

具有相同哈希值的不同 python 冻结集

我的理解是散列需要包含可散列对象的两个不同的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)

python set frozenset

5
推荐指数
1
解决办法
569
查看次数

标签 统计

python ×4

hash ×3

caching ×1

cpython ×1

frozenset ×1

hash-collision ×1

set ×1