hash算法

hash定义:把任意长度的输入,通过hash算法,变换成固定长度的输出。输出的空间通常远小于输入值的空间。
     数学表达式:h = H(M)
                 其中H()为单向hash算法,M为任意长度输入,h为固定长度的输出


一般应用的Hash算法,还需要满足其他关键特性:

第一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计算上不可能
构造一个预映射,使其散列结果等于某个特定的散列值,即构造相应的M=H-1(h)不可行。
这样,散列值就能在统计上唯一的表征输入值,因此,密码学上的 Hash 又被称为"消息摘
要(message digest)",就是要求能方便的将"消息"进行"摘要",但在"摘要"中无法得到比
"摘要"本身更多的关于"消息"的信息。

即hash算法是单向的,不可逆的。你可以由一个输入值通过hash算法得到一个输出值,却不可能

找到任何一个算法,可以由该输出值逆运算成输入值



第二是抗冲突性(collision-resistant),即在统计上无法产生2个散列值相同的预映射。
给定M,计算上无法找到M',满足H(M)=H(M') ,此谓弱抗冲突性;计算上也难以寻找一对
任意的M和M',使满足H(M)=H(M') ,此谓强抗冲突性。要求"强抗冲突性"主要是为了防范
所谓"生日攻击(birthday attack)",在一个10人的团体中,你能找到和你生日相同的人的
概率是2.4%,而在同一团体中,有2人生日相同的概率是11.7%。类似的,当预映射的空间
很大的情况下,算法必须有足够的强度来保证不能轻易找到"相同生日"的人。

即一个输入值通过hash算法对应着固定的一个输出值,不同的输入值在有限的时间与空间内

对应着不同的输出值,不会重复。



第三是映射分布均匀性和差分分布均匀性,散列结果中,为 0 的 bit 和为 1 的 bit ,
其总数应该大致相等;输入中一个 bit 的变化,散列结果中将有一半以上的 bit 改变,
这又叫做"雪崩效应(avalanche effect)";要实现使散列结果中出现 1bit 的变化,则输
入中至少有一半以上的 bit 必须发生变化。其实质是必须使输入中每一个 bit 的信息,
尽量均匀的反映到输出的每一个 bit 上去;输出中的每一个 bit,都是输入中尽可能多
bit 的信息一起作用的结果。

这个是hash算法的设计规则,迭代运算。

 

举例说一下

 DWORD GetHash(char *fun_name)
{
           DWORD digest = 0;
           while (*fun_name)
           {
                       digest = ((digest << 25) | (digest >> 7));
                       digest = digest + *fun_name;
                       fun_name++;
            }
            return digest;
}

 

说明:

(1)我们任意长度的输入(这里是以字符串的形式),即为char *fun_name,通过while循环中简单的算法,使得最后的输出digest为固定的32位数(DWORD)。

(2)其中while中第一句的作用是将digest以一定的形式打乱,以保证输入在一定程度下的输出不会重复。(这个是根据经验和实验总结的)
(3)while中的第二局的作用是将输出与输入相关联。

 

hash的应用:
    (1)加密。著名的hash加密算法有MD5,SHA1。
    (2)快速查找。




posted @ 2011-10-15 21:23  only_eVonne  阅读(1278)  评论(0编辑  收藏  举报