当前位置: 首页 > 面试题库 >

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

慕凌
2023-03-14
问题内容

我需要比较大量的数据进行平等的,我需要比较每秒多对, 快速 。保证每个对象的长度相同,有可能而且有可能在未知位置仅存在细微差异。

下面的时间表明,==如果在数据的开头附近存在差异,则使用算符的速度非常快,而如果在结尾处存在差异,则使用运算符的速度将显着降低。

>>> 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位的空间,这使您几乎不可能遇到碰撞,除非您专门寻找一个碰撞。

如果您可以处理冲突(例如,可以通过使用MD5或SHA2等加密算法来测试存储桶中所有成员之间的相等性),那么Python的哈希函数就可以了。

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

附带说明:is与==Python不等效。你是说==



 类似资料:
  • keys 一个包含哈希表中查找到的键的序列。 请注意,并不是所有的哈希表都支持这个 (询问程序员一个指定的哈希表是否允许这么操作)。 <#assign h = {"name":"mouse", "price":50}> <#assign keys = h?keys> <#list keys as key>${key} = ${h[key]}; </#list> 将会输出: name = mouse

  • 我试图为node.js创建一个脚本,将在多个环境中工作。特别是对我来说,我在OS X和Ubuntu之间来回切换。在前者中,Node被安装为,但在后者中它是。在我的脚本顶部,我可以有: 或者 只要安装了节点,我宁愿让脚本作为任一环境的可执行文件运行,而不是让一个或另一个必须指定命令(vs.)。 是否有任何方法可以为node.js指定备份hashbang或在任何情况下都兼容的备份hashbang?

  • 问题内容: 我需要一个可逆的哈希函数(显然,输入的大小将比输出小得多),该函数将输入以随机的方式映射到输出。基本上,我想要一种将“ 123”之类的数字转换为“ 9874362483910978”之类的较大数字的方法,但不是要保留比较的方法,因此,如果x1> x2,f(x1 )> f(x2)(但也不能始终为假)。 这种情况的用例是,我需要找到一种方法将小数字转换成看起来更大的随机数字。它们实际上并不

  • 我有两个二维数组: 在第一个 2D 阵列中,我有 2 个子阵列(实际上有 16 个) - 每个产品一个。它们中的每一个都为同一产品列出了不同的名称(每个产品可以有 1 到 22 个备用名称)。 在第二个 2D 阵列中,我有 2 个子阵列(实际上也有 16 个) - 每个产品每个价目表一个。它们中的每一个都列出了来自前一个 2D 数组中相应子数组的同一产品(实际上为 10 个价格选项)的不同价格(实

  • 在查看了用于生成 Java MD5 和 SHA* 哈希的多个在线参考后,我注意到纯文本(文件字符串)之前经历了某些准备 PS:我想答案与Java和Digest对象如何处理它们的业务有关,我问这个问题的动机是为了理解这种行为,并可能获得一些深入解释这一点的文档/文献的参考资料。 丹科!

  • 我正在尝试编写一个C程序,使用哈希表来存储不同的单词,我需要一些帮助。 首先,我创建一个哈希表,其大小为最接近我必须存储的单词数的素数,然后我使用一个哈希函数为每个单词找到一个地址。我从最简单的函数开始,把字母加在一起,结果有88%的碰撞。然后我开始实验这个函数,发现无论我把它改成什么,碰撞都不会低于35%。现在我在用 这只是我想出来的一个随机函数,但它给了我最好的结果--大约35%的碰撞。 在过