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

哈希在python中做什么?

阎伟志
2023-03-14
问题内容

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


问题答案:

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

>>> 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应用程序等的重要安全功能。

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



 类似资料:
  • 问题内容: 我想在Python中实现HashMap。我想请用户输入。根据他的输入,我正在从HashMap中检索一些信息。如果用户输入HashMap的键,我想检索相应的值。 如何在Python中实现此功能? 问题答案: Python字典是一种内置的类型,支持键值对。 以及使用dict关键字: 要么:

  • 从原理到应用分析什么是哈希? 一、什么是哈希? 哈希(hash):将任意长度的输入(关键字),通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值,通常哈希值代表了关键字的存储位置。 但是为什么要这样做呢?或者说,哈希是怎样来的呢? 哈希的出现解决了两个问题:存储和搜索。 1. 存储(数据结构):如果在容器中保存对象及其关联的键,并且不用键

  • 问题内容: 我偶然发现了一篇博客文章,详细介绍了如何在Python中实现powerset函数。因此,我尝试用自己的方式进行操作,并发现Python显然无法拥有一组集合,因为set无法哈希。这很烦人,因为功率集的定义是它是一组集合,而我想使用实际的集合操作来实现它。 Python集不可散列是否有充分的理由? 问题答案: 通常,在Python中只有不可变的对象才是可哈希的。的不可变的变体- -是哈希的

  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 问题内容: 之间有什么区别: 我看到super在只有单一继承的类中经常使用它。我知道为什么你会在多重继承中使用它,但是不清楚在这种情况下使用它的好处。 问题答案: 单继承的好处是微不足道的-大多数情况下,你不必将基类的名称硬编码到每个使用其父方法的方法中。 但是,如果不使用,几乎不可能使用多重继承。这包括常见的惯用语,例如,接口,抽象类等。这扩展到了以后扩展你的代码的代码。如果以后有人想编写一个扩

  • 问题内容: Google不允许我进行搜索,因此我在查找相关文档时遇到了麻烦。有人知道吗 问题答案: 在成对的对象之间执行 就地 +操作。尤其是: 集合:联合操作 dicts:更新操作 计数器:(多集)联合运算 数字:按位或,二进制运算 在大多数情况下,它与操作员有关。请参阅下面的示例。 套装 例如,两个分配的集合的并并共享以下等效表达式: 其中的最终值等于: 分配的OR操作 就地或运算 通过特殊方