算法之哈希

文章目录

    • 什么是哈希算法
    • 哈希算法的应用
      • 安全加密
      • 唯一标识
      • 散列函数


哈希算法历史悠久,业界著名的哈希算法也有很多,比如 MD5、SHA 等。在开发中,基本上都是拿现成的直接用。

什么是哈希算法

不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。哈希算法的定义:任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。哈希算法需要满足以下要求:

1:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
2:对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;
3:散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
4:哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。

通过MD5加密算法来说明一下,分别对“哈希算法”和“jiajia”这两个文本,计算 MD5 哈希值,得到两串看起来毫无规律的字符串。可以看出来,无论要哈希的文本有多长、多短,通过 MD5 哈希之后,得到的哈希值的长度都是相同的,而且得到的哈希值看起来像一堆随机数,完全没有规律。

MD5("哈希算法") = bb4767201ad42c74e650c1b6c03d78fa
MD5("jiajia") = cd611a31ea969b908932d44d126d195b

两个非常相似的文本,“哈希算法!”和“哈希算法”。这两个文本只有一个感叹号的区别。如果用 MD5 哈希算法分别计算它们的哈希值,你会发现,尽管只有一字之差,得到的哈希值也是完全不同的。

MD5("哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb
MD5("哈希算法") = a1fb91ac128e6aa37fe42c663971ac3d

哈希算法的应用

哈希算法的应用非常非常多,最常见的分别是安全加密、唯一标识、数据校验、散列函数等。

安全加密

最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。

对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 因为加密的目的就是防止原始数据泄露,所以很难通过哈希值反向推导原始数据,这是一个最基本的要求。不管是什么哈希算法,只能尽量减少碰撞冲突的概率,**理论上是没办法做到完全不冲突的。**这是为什么呢?

先看个例子:如果有 10 个鸽巢,有 11 只鸽子,那肯定有 1 个鸽巢中的鸽子数量多于 1 个,换句话说就是,肯定有 2 只鸽子在 1 个鸽巢内。(鸽巢原理

为什么哈希算法无法做到零冲突? 哈希算法产生的哈希值的长度是固定且有限的。比如前面举的 MD5 的例子,哈希值是固定的 128 位二进制串,能表示的数据是有限的,最多能表示 2^128 个数据,而要哈希的数据是无穷的。基于鸽巢原理,如果我们对 2^128+1 个数据求哈希值,就必然会存在哈希值相同的情况。所以,一般情况下,哈希值越长的哈希算法,散列冲突的概率越低。 不过,即便哈希算法存在散列冲突的情况,但是因为哈希值的范围很大,冲突的概率极低,所以相对来说还是很难破解的。

唯一标识

如果要在海量的图库中,搜索一张图是否存在,不能单纯地用图片的元信息(比如图片名称)来比对,因为有可能存在名称相同但图片内容不同,或者名称不同图片内容相同的情况。那该如何搜索呢?可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。 通过这个唯一标识来判定图片是否在图库中。

散列函数

散列函数是设计一个散列表的关键。它直接决定了散列冲突的概率和散列表的性能。不过,相对哈希算法的其他应用,散列函数对于散列算法冲突的要求要低很多。即便出现个别散列冲突,只要不是过于严重,都可以通过开放寻址法或者链表法解决。

你可能感兴趣的:(数据结构与算法,算法)