Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是python的恰当使用吗';s内置的哈希函数?_Python_Hash_Hash Collision - Fatal编程技术网

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

这是python的恰当使用吗';s内置的哈希函数?,python,hash,hash-collision,Python,Hash,Hash Collision,我需要比较大块的数据以获得相等性,并且我需要每秒快速比较多对数据。每个物体的长度都是相同的,在未知的位置上可能也可能只有细微的差别 下面的计时显示,如果在数据开始处附近存在差异,则使用=运算符非常快,如果差异位于接近结束处,则速度明显较慢 >>> import os >>> s = os.urandom(1600*1200 - 1) >>> Aimg = b"A" + s >>> Bimg = b"B" + s >&g

我需要比较大块的数据以获得相等性,并且我需要每秒快速比较多对数据。每个物体的长度都是相同的,在未知的位置上可能也可能只有细微的差别

下面的计时显示,如果在数据开始处附近存在差异,则使用
=
运算符非常快,如果差异位于接近结束处,则速度明显较慢

>>> import os
>>> s = os.urandom(1600*1200 - 1)
>>> Aimg = b"A" + s
>>> Bimg = b"B" + s
>>> img1 = s + b"1"
>>> img2 = s + b"2"
>>> %timeit Aimg == Bimg
61.8 ns ± 0.484 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit img1 == img2
159 µs ± 2.83 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
在我的用例中,差异可能位于字节的中间或末尾(上下文:它是未压缩的图像数据)。我在寻找一种使用哈希或校验和来加速事情的方法。使用md5速度较慢,但Python内置的
hash
确实加快了速度

>>> %timeit img1 == img2
160 µs ± 5.96 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit hash(img1) == hash(img2) and img1 == img2
236 ns ± 5.91 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

我对这个散列的技术细节感兴趣,当
hash(a)==hash(b)
时,它是否足够散列,那么
a==b
很可能是这样的?如果哈希冲突相当罕见,则误报是可以接受的,其目的是在平均情况下加快比较的快速路径。

Python的哈希函数旨在提高速度,并映射到64位空间。由于存在冲突,这意味着您可能会在大约50亿个条目处发生冲突(可能是更早,因为哈希函数不是加密函数)。另外,
hash
的精确定义取决于Python实现,可能是特定于体系结构的,甚至是特定于机器的。如果您希望在多台机器上获得相同的结果,请不要使用它

md5被设计为加密哈希函数;即使输入中的微小扰动也会完全改变输出。它还映射到一个128位的空间,这使得您不太可能遇到任何冲突,除非您专门寻找一个

如果您可以处理冲突(即,测试bucket中所有成员之间的平等性,可能使用诸如MD5或SHA2之类的加密算法),那么Python的哈希函数就非常好

还有一件事:为了节省空间,如果将数据写入磁盘,则应以二进制形式存储数据。(即
struct.pack(“!q',hash('abc'))
/
hashlib.md5('abc').digest()


作为旁注:与Python中的
==
不同。你的意思是
=

哈希函数依赖于体系结构,这应该是
!q
而不是
!我
?示例
struct.pack('!I',hash('abc'))
给出了
struct.error:'I'格式确实需要0@AndyHayden。固定的。