【发布时间】:2011-04-17 19:01:03
【问题描述】:
尴尬的是,选择一个散列函数(例如,用于散列字符串或整数集等)对我来说仍然很神奇:这里取一些素数,那里取一些魔法常数,做一些位移,取模,然后完成.
有没有关于创建哈希函数的漂亮、温和且平易近人的教程?
【问题讨论】:
标签: function hash language-agnostic
尴尬的是,选择一个散列函数(例如,用于散列字符串或整数集等)对我来说仍然很神奇:这里取一些素数,那里取一些魔法常数,做一些位移,取模,然后完成.
有没有关于创建哈希函数的漂亮、温和且平易近人的教程?
【问题讨论】:
标签: function hash language-agnostic
很好奇找到哈希算法的基本解释是多么困难。可能题目太难了,做个基础教程不容易。我自己也在找一个,遇到了同样的问题。
但是你可以试试这个页面。很酷的地方在于,在您阅读完页面后,底部有一个文本框。如果您将文本添加到该框并提交表单,则结果是它如何散列输入文本的分步列表。
http://www.metamorphosite.com/one-way-hash-encryption-sha1-data-software
祝你好运。如果您发现更好的东西,如果您将其发布在此处将非常有帮助。
【讨论】:
您可以在Hash Table Tutorial 找到一个体面、简单的哈希教程(也讨论哈希函数)。请注意,如果您进行网络搜索,您可以找到很多有用的信息。
维基百科有一些关于Hash Tables 和Hash Functions 的基本信息。
编辑
之前有人问过类似的问题:Which Hash Function Should I Choose。问题和答案都很棒。
【讨论】:
来自link,在下面突出显示一些提供概述的部分
什么是好的散列函数
大多数好的散列函数通过计算除以表大小 N 后的余数来工作。
这总是给出一个介于 0 和 N-1 之间的值,因此它是合适的,但如果 N 是质数,那么它也非常适合将数据分散在桌子周围。当然,如果你有一个想要散列的文本值,你首先必须将它转换成一个合适的数值,而像示例中的简单方案是行不通的。
您需要为每个可能的文本值生成不同的数值,并且将前两个字母的 ASCII 代码加在一起显然是行不通的。更好的方法是通过字母的位置对每个 ASCII 代码进行加权,第一个字符乘以 1,第二个字符乘以 10,第三个字符乘以 100,依此类推……然后将它们相加得到一个值。
一般来说,构建一个非常好的哈希函数是很困难的,在大多数情况下,您需要找到一个具有良好属性并经过良好测试的函数。
【讨论】: