当前位置: 首页 > 知识库问答 >
问题:

哈希码计算

范翰海
2023-03-14

我刚刚讨论了散列码的概念,遇到了一行:与素数相乘不会将信息从低端转移出去,就像乘以2的幂一样

我没有得到这条线,有人能帮我吗?

谢谢。


共有2个答案

籍英叡
2023-03-14

在许多哈希代码的使用中,只有哈希代码中最不重要的部分的更改才起作用。换句话说,3和5之间的差异很重要,但3000和5000也可能是相同的数字。

原因是hashcode用于根据hashcode的值将值粗略地“排序”到“bucket”中。这使得哈希表这样的结构只能在bucket中搜索特定的值,而不是搜索表中的每个元素。

问题是,有超过40亿个可能的哈希代码,但通常要将值放入的存储桶数量要少得多。

想象一个场景,你将散列成10个桶。哈希代码0-9都可以放入不同的桶中,但是10需要与0放入同一个桶中,11需要与1放入同一个桶中,以此类推。如果你有1、145、42、5830这样的哈希代码,一切都很好,因为这些值都可以放在不同的存储桶中。另一方面,对于像1、131、593021、63421这样的值,它们都将进入同一个存储桶,因为它们以相同的数字结束,这就是我们所看到的,因为我们只有10个存储桶。因此,对我们来说真正重要的只是哈希代码中最不重要的部分的变化。

富涛
2023-03-14

该建议适用于计算基于多个字段的哈希代码。它基于这样一种观察:在0到32之间乘以2的幂等于将数字向左移位相应的位数,从而“调零”数字的右侧。

考虑一个情况,当你需要构造一个十字段的哈希代码时,你将每个字段的哈希代码乘以32。这相当于将哈希代码向左移动五位。如果这样做,结束哈希代码将不依赖于前三个字段的哈希代码,因为它们的哈希代码的值将从结果哈希代码中移出。

这种行为是不可取的,因为最后七个字段相同的项将具有相同的哈希代码,即使前三个字段可能不同。这很糟糕,因为它增加了散列冲突的可能性。相反,如果乘以2以上的素数,每个字段的哈希值的一些信息会影响最终结果,从而产生更好的哈希函数。

 类似资料:
  • 我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。

  • 问题内容: 基本类型(例如int)的哈希码是什么? 例如,假设num是一个整数。 问题答案: 对于一个最自然的选择是使用本身。一个更好的问题是,用什么的的,因为它不适合的尺度的哈希码。您的最佳解决方案以及所有相关问题将是有效的Java。

  • 问题内容: 我正在寻找一种使用mongoose将帐户保存到MongoDB的好方法。 我的问题是:密码是异步哈希的。设置器将无法在这里工作,因为它只能同步工作。 我考虑了两种方法: 创建模型的实例,并将其保存在哈希函数的回调中。 在“保存”上创建一个预钩子 这个问题有什么好的解决办法吗? 问题答案: mongodb博客上有一篇很棒的文章,详细介绍了如何实现用户身份验证。 http://blog.mo

  • 多亏了最近一篇文章中的一些好建议,我才从中实现了PBKDF2https://defuse.ca/php-pbkdf2.htm进入一个小的PHP图像库,我正在建设教自己一些PHP。 我知道您将salt和hash存储在数据库中,然后在用户输入密码时重新构建它们以匹配。我不明白的是,当上面网站上的validate_password函数为同一个密码生成不同的、唯一的salt时,它是如何工作的。 例如,我创