为了账号安全,请及时绑定邮箱和手机立即绑定

什么是好的哈希函数?

什么是好的哈希函数?

噜噜哒 2019-12-09 09:39:21
什么是良好的哈希函数?我在大学的数据结构课程中看到了很多哈希函数和应用程序,但是我大多数都知道要创建一个好的哈希函数非常困难。为了避免发生冲突,我的教授说:function Hash(key)  return key mod PrimeNumberend(mod是C和类似语言的%运算符)质数应为哈希表的大小。我知道这是一个不错的功能,可以避免碰撞,而又可以避免快速碰撞,但是我怎样才能制造出更好的呢?是否有针对数字键的字符串键更好的哈希函数?
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

没有通用哈希的“良好哈希函数”之类的东西(是的,我知道有“通用哈希”之类的东西,但这不是我的意思)。取决于上下文,不同的标准确定哈希的质量。已经有两个人提到SHA。这是一个加密哈希,对于哈希表(您可能要说的)根本没有好处。


哈希表有非常不同的要求。但是,仍然很难普遍地找到一个好的哈希函数,因为不同的数据类型会公开不同的可以哈希的信息。根据经验,最好将一种类型的所有信息均等地考虑在内。这并不总是那么容易甚至不可能。出于统计原因(并因此产生冲突),在问题空间(即所有可能的对象)上产生良好的分布也很重要。这意味着,当对100到1050之间的数字进行哈希处理时,让最高有效位在哈希表中扮演重要角色是不好的,因为对于90%的对象,该数字将为0。让最后三个数字更重要数字确定哈希。


同样,在对字符串进行哈希处理时,考虑所有字符也很重要–除非事先知道所有字符串的前三个字符都相同,考虑这些便是浪费。


实际上,这是我建议阅读Knuth在《计算机编程艺术》第一卷中说的内容之一。3.另一本好书是朱丽安·沃克(Julienne Walker)的《散列的艺术》。


查看完整回答
反对 回复 2019-12-09
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

哈希函数有两个主要目的:

  • 将数据点均匀分散到n位。

  • 安全地识别输入数据。

不知道您要使用的哈希是不可能推荐哈希的。

如果您只是在程序中创建哈希表,则无需担心该算法的可逆性或可破解性……SHA-1或AES对此完全没有必要,最好使用FNV的变体。FNV与您提到的简单质数调制相比,具有更好的分散性(从而减少了冲突),并且更适应于各种输入大小。

如果您使用散列来隐藏和验证公共信息(例如对密码或文档进行哈希处理),则应使用由公众审查审查的主要哈希算法之一。哈希函数休息室是一个不错的起点。


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 692 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信