avatar1 avatar
@{[{user.name}]}
希腊·圣域
since February 1500

到底什么是HASH和HASH算法?

讲到 哈希(HASH) 就必然会讲到 哈希算法哈希值

做程序的难免会经常听到看到HASH,印象中只知道HASH运算就是把一串字符转换成一种不重复的字符串,不论是文件,数字,字符串等等都可以进行哈希运算而得到一个唯一的哈希值。当然这样理解是有恰当或者不对的。

它们之间的关系非常简单

一段任意长度的数据 -> 哈希算法 -> 哈希值

哈希算法并不是一个特定的算法,而是一类算法的统称。常见的哈希算法实现有MD5SHA

哈希算法的定义

哈希算法也叫做散列算法,一般来说只要一个算法满足关系:f(data)=value, 输入任意长度的data数据,经过该算法运算后输出一个定长的数据value,同时这个过程是不可逆的,即无法由value推导出data,该算法就可以称作为一个哈希算法。如果对一组数据集做哈希处理,将得到的结果与原始数据集做一一映射后就可以得到一个哈希表。

哈希的两个重要性质

基于哈希的定义而已归纳总结为: 不可逆无冲突

关于哈希值的“重复”

哈希的性质之一为无冲突, 但根据哈希算法的定义,...运算后会输出一个定长的数据..., 即一个哈希算法的值域是有限的,然而输入的原始数据可以是任意长度任何的组合,即原始数据是无穷的,那么这样“重复”是不可以避免的,也就是说有可能两个不同的输入会得到相同的哈希值。那么这样就违背了我们的无冲突的性质,其实冲突是不可避免的,业界内称作 碰撞(Collision),所以这里的无冲突其实是指明:一个好的成熟的哈希算法会有较好的抗冲突性

安全性

总之,如果两个相同的原始输入数据,在同一个哈希算法下一定会得到相同的哈希值,但是哈希值相同的两个原始输入数据不一定相同,即 不可逆

一个简单的哈希算法的例子

以前看过一个简单的例子,讲的是如果你存储了很多歌曲,但是当你要添加新的歌曲的时候为了节省资源要检测一下是否已经存在了,但是同样的歌可以命名不一样的歌曲名字,为了避免这样的事情发生,我们通过计算(哈希算法)获得歌曲的大小(哈希值),通过与新歌的大小对比从而区分出是否该歌曲已经存在。当然不严格的讲计算文件大小的过程也可以称作一个哈希算法,只是这个哈希算法非常脆弱罢了。

总的来说

f(data) = value, 不可逆,抗冲突

  25 October, 2016     25 October, 2016