哈希 Hash 算法介绍
Hash,简单地说,任何长度的输入信息都可以通过算法转换为固定长度的输出信息,即哈希值。通常,哈希值的格式是16或10进制,如以下使用 md5 哈希算法示例
md5("123456") => "e10adc3949ba59abbe56e057f20f883e"
主要特点:
-
Hash现代密码系统中广泛使用的算法
-
无碰撞。不同的信息在哈希后得到不同的值,但理论上,哈希算法实际上可能会发生碰撞,输入信息是无限的,输出的哈希值长度是固定的,因此有限。例如,如果你想把10个苹果放在9个抽屉里,一个抽屉里肯定会有多个苹果,但哈希算法的碰撞概率很小,比如128个哈希值,有2个128立方米的空间。
-
效率高。在处理较大的原始值时,也可以快速计算哈希值
哈希算法有很多实现,常见的有 MD5,SHA-1,还有像 C#,Java 有些语言有直接的 GetHashCode(),hashCode() 函数可直接使用。
在互联网场景中,通常面临大量的数据和用户。为了满足大量数据的写入和查询,以及高可用性,单机存储服务器不能满足需求,通常需要使用多个服务器形成分布式存储。
场景描述:
在本文中,为了方便大家更好的理解,列出了三个用户,即 James、 Bob、 Lee,我们需要在存储服务器节点中写下用户的图片ABC三个节点,当查询用户的图片时,需要快速定位用户的图片存储在哪个节点,然后直接从该节点查询,以满足高效的查询。
实现思路:
首先,我们可以识别用户标志Hash 计算,为了方便演示,我在这里使用用户名作为Hash当然,你也可以对待用户IP或者是UserId 进行Hash计算,Hash计算后会生成一个int这里的公式是 hash(name) % 3,计算结果只有三种情况,即 0、1、2,然后我们将这三种结果和三个存储节点进行映射,0 ==> A,1 ==> B,2 == C。因为Hash算法在多次计算一个值后会得到相同的hash值,所以上面的公式,一个用户的图片每次都会固定在其中一个节点中,这样查询也可以通过hash算法快速找到用户图片所在的节点。