我看到了一个将 hash
函数应用于元组的代码示例。结果它返回一个负整数。我想知道这个功能有什么作用?谷歌没有帮助。我找到了一个解释如何计算哈希的页面,但它没有解释为什么我们需要这个函数。
最佳答案
A hash is an fixed sized integer that identifies a particular value .每个值都需要有自己的哈希值,因此对于相同的值,即使不是同一个对象,您也会得到相同的哈希值。
>>> hash("Look at me!")
4343814758193556824
>>> f = "Look at me!"
>>> hash(f)
4343814758193556824
哈希值的创建方式需要使结果值均匀分布,以减少您获得的哈希冲突次数。哈希冲突是指两个不同的值具有相同的哈希。因此,相对较小的更改通常会导致非常不同的哈希值。
>>> hash("Look at me!!")
6941904779894686356
这些数字非常有用,因为它们可以在大量值集合中快速查找值。它们的两个使用示例是 Python 的 set
和 dict
。在一个list
中,如果要检查一个值是否在列表中,用if x in values:
,Python需要遍历整个列表并比较x
与列表 values
中的每个值。对于较长的 list
,这可能需要很长时间。在 set
中,Python 会跟踪每个哈希值,当您键入 if x in values:
时,Python 将获取 x
的哈希值>,在内部结构中查找,然后仅将 x
与与 x
具有相同哈希值的值进行比较。
字典查找使用相同的方法。这使得 set
和 dict
中的查找速度非常快,而 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 应用程序等来说是一项重要的安全功能。
因此不应永久存储哈希值。如果您需要以永久方式使用哈希值,您可以查看更“严重”的哈希类型,cryptographic hash functions ,可用于对文件等进行可验证的校验和。
关于python - 哈希在python中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585730/