首先,Hash算法早于区块链已经存在无数年了,是密码学的重要算法。
Hash算法甚至早于计算机,早在公元前犹太人抄录的《圣经》中就可以看到Hash算法的应用。
一个小例子告诉你为啥用Hash算法
给你两个字符串:hello 和 world,请你比较两个字符串是否相同?
你的计算的步骤是不是这样:比较第1个字符:h != w
所以,这两个字符串不同。
~~~~~~~~~~~~
我再给你两个字符串:hello 和 hellp ,你怎么知道这两个字符串不一样?
计算步骤是不是这样:
1 h == h
2 e == e
3 l == l
4 l == l
5 o != p
所以,这两个字符串不同。
虽然有点儿啰嗦,循环5次,也可以忍受。我忍,我忍。。。
~~~~~~~~~~~~
我再给你两个字符串:
字符串1:hellohellohellohellohellohellohellohellohello......hellohello
字符串2:hellohellohellohellohellohellohellohellohello......hellohell0
注意:上面省略号部分我省略了1万个hello,你给我说说你的算法吧?
计算步骤是不是这样:
循环几万次{
比较每个字符是否相同;
}
如果全部相同,那么两个字符串就一样,否则就不同。
这样每次计算都要循环几万遍,性能太差了吧。
~~~~~~~~~~~~~
开动脑筋啊!困难重重,困难重重。。。。
想到了。计算机中的字符其实是一个数字,所以能不能把字符串的字符转换为数字,然后通过加减乘除乘方开方等一系列算法(这个算法就是Hash算法),把字符串转换为一个数字呢?
嗯嗯,是可以的。这样上面那个几万个长度的字符串,就得到了一个整数。
这样,比较两个字符串的时候,就可以比较这两个整数是否相等:整数1 == 整数2
哇!!!这样比较速度好快啊,原来循环好几万次,现在1次比较就得到结果了。
开动脑筋
~~~~~~~~~~~~~~~
把这个事儿说的学术点:
1 Hash算法将源数据通过一系列的计算生成一个整数的算法。
2 Hash算法力求原数据不同的情况下,计算出来的结果也不同。
3 Hash算法要求原数据相同的情况下,计算出来的结果必须相同。
4 Hash算法是一种加密算法。
5 Hash算法的主要目的是比较两个数据是否相同。
6 Hash算法是统称,并不是一个具体的公式,只要能满足前面5个条件,就属于Hash算法。
~~~~~~~~~~~~~~~~
让我们设计一个简单的Hash算法。
把每一位字符转换为数字,并根据所在位数乘以10的次方,然后计算各位数字的和。
hello ==> h(104) e(101) l(108) l(108) o(111)
104*10^4 + 101*10^3 + 108*10^2 + 108*10 + 111= 1152991
------------------------------
hellp ==> h(104) e(101) l(108) l(108) p(112)
104*10^4+101*10^3+108*10^2+108*10+112= 1152992
通过比较1152991 != 1152992,可以判断这两个字符串不同。
说明:这里采用的是ascii码
这里举的例子,有的朋友可能看不出Hash算法的价值,在这个例子里面明显看不出Hash算法的优势啊,感觉还不如循环速度快呢。
这里要解释一下应用场景:
如果两个字符串都很短,这个Hash算法体现不出优势。
但是如果字符串很长,循环起来非常耗时,这时候Hash算法就很快了。
而且Hash算法是可以优化的,不会像我设计的这个,只是傻傻各位求和。
~~~~~~~~~~~~~~~~~~
上面例子是字符串之间的比较,我们继续深入想想。
计算机中所有的数据都是数字。
无论是文字、图片、声音、视频、文件等等,根本都是存储的数字。
因此,计算机中存储的任何数据都可以进行Hash计算。
应用场景:
总之,只要是有加密的地方,就有Hash算法;没有加密的地方,很多也需要Hash算法。
Hash算法,无处不在
领取专属 10元无门槛券
私享最新 技术干货