一尘不染

哈希在python中做什么?

python

我看到了一个将hash函数应用于元组的代码示例。结果,它返回一个负整数。我想知道这个功能做什么?Google没有帮助。我找到了一个页面,该页面解释了哈希的计算方式,但没有解释为什么我们需要此函数。


阅读 181

收藏
2020-12-20

共1个答案

一尘不染

哈希是一个固定大小的整数,用于标识特定值。每个值都需要有自己的哈希,因此对于相同的值,即使不是同一对象,您也将获得相同的哈希。

>>> hash("Look at me!")
4343814758193556824
>>> f = "Look at me!"
>>> hash(f)
4343814758193556824

散列值的创建方式应使结果值均匀分布,以减少所得到的散列冲突次数。哈希冲突是指两个不同的值具有相同的哈希。因此,相对较小的变化通常会导致完全不同的哈希值。

>>> hash("Look at me!!")
6941904779894686356

这些数字非常有用,因为它们可以在大量值中快速查找值。使用的两个示例是Pythonsetdict。在中list,如果要检查列表中是否有值,请使用if x in values:Python,需要遍历整个列表并x与列表中的每个值进行比较values。这可能需要很长时间list。在其中set,Python会跟踪每个哈希,当您键入时if x in values:,Python会获取其哈希值x,在内部结构中查找该哈希值,然后仅x与与哈希相同的值进行比较x

字典查找使用相同的方法。这使得查找中setdict速度非常快,而在查找list缓慢。这也意味着您可以在中使用不可哈希对象list,但不能在中将其set作为键或将其作为键dict。不可哈希对象的典型示例是任何可变对象,这意味着您可以更改其值。如果您有一个可变的对象,则它不应是可哈希的,因为它的哈希值将在其生命周期内发生变化,这会引起很多混乱,因为对象最终可能会在字典中的错误哈希值之下。

请注意,对于一次Python运行,值的哈希值仅需相同。实际上,在Python 3.3中,它们会随着每次新的Python运行而改变:

$ /opt/python33/bin/python3
Python 3.3.2 (default, Jun 17 2013, 17:49:21) 
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> hash("foo")
1849024199686380661
>>> 
$ /opt/python33/bin/python3
Python 3.3.2 (default, Jun 17 2013, 17:49:21) 
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> hash("foo")
-7416743951976404299

这使得很难猜测某个字符串将具有什么哈希值,这是Web应用程序等的重要安全功能。

因此,哈希值不应永久存储。如果您需要永久使用哈希值,则可以查看更“严重”的哈希类型,即加密哈希函数,可用于生成文件的可验证校验和等。

2020-12-20