python - 哈希在python中做了什么?

标签 python hash

我看到了一个将 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 的 setdict。在一个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 应用程序等来说是一项重要的安全功能。

因此不应永久存储哈希值。如果您需要以永久方式使用哈希值,您可以查看更“严重”的哈希类型,cryptographic hash functions ,可用于对文件等进行可验证的校验和。

关于python - 哈希在python中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585730/

相关文章:

python - web2py - 允许外部访问 - 如何?

Bash 扩展哈希表(字典)

c++ - 如何找到字符串中每个后缀的出现次数?

PHP-hash_pbkdf2 函数

python - 类型错误 : ufunc 'true_divide' output (typecode 'd' ) could not be coerced to provided output parameter (typecode 'q' )

python - 是否可以使用 pip 安装最新的标签?

python - python中unicode字符串的转换

python - 两个 Pandas 数据帧的相关矩阵

ruby - Hash 的 compare_by_identity 是如何工作的?

java - 在这种情况下有没有更好的方法来调制哈希值?