Hash算法的应用

Posted 澳链财经

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hash算法的应用相关的知识,希望对你有一定的参考价值。

1、Hash在管理数据结构中的应


在用到hash进行管理的数据结构中,就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以。 比如hashmap,hash值(key)存在的目的是加速键值对的查找,key的作用是为了将元素适当地放在各个桶里,对于抗碰撞的要求没有那么高。

Hash算法的应用

换句话说,hash出来的key,只要保证value大致均匀的放在不同的桶里就可以了。 但整个算法的set性能,直接与hash值产生的速度有关,所以这时候的hash值的产生速度就尤为重要,以JDK中的String.hashCode()方法为例:

  
    
    
  
  1. public int hashCode() {
  2. int h = hash;
  3. //hash default value : 0
  4. if (h == 0 && value.length > 0) {
  5. //value : char storage
  6. char val[] = value;
  7. for (int i = 0; i < value.length; i++) {
  8. h = 31 * h + val[i];
  9. }
  10. hash = h;
  11. }
  12. return h;
  13. }

很简洁的一个乘加迭代运算,在不少的hash算法中,使用的是异或+加法进行迭代,速度和前者差不多。

2、Hash在在密码学中的应用


在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。 举个例子,我们登陆知乎的时候都需要输入密码,那么知乎如果明文保存这个密码,那么黑客就很容易窃取大家的密码来登陆,特别不安全。 那么知乎就想到了一个方法,使用hash算法生成一个密码的签名,知乎后台只保存这个签名值。 由于hash算法是不可逆的,那么黑客即便得到这个签名,也丝毫没有用处; 而如果你在网站登陆界面上输入你的密码,那么知乎后台就会重新计算一下这个hash值,与网站中储存的原hash值进行比对,如果相同,证明你拥有这个账户的密码,那么就会允许你登陆。 银行也是如此,银行是万万不敢保存用户密码的原文的,只会保存密码的hash值而而已。 在这些应用场景里,对于抗碰撞和抗篡改能力要求极高,对速度的要求在其次。 一个设计良好的hash算法,其抗碰撞能力是很高的。 以MD5为例,其输出长度为128位,设计预期碰撞概率为2^128,这是一个极小极小的数字——而即便是在MD5被王小云教授破解之后,其碰撞概率上限也高达,也就是说,至少需要找次才能有1/2的概率来找到一个与目标文件相同的hash值。 而对于两个相似的字符串,MD5加密结果如下:

  
    
    
  
  1. MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
  2. MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8";
可以看到仅仅一个比特位的改变,二者的MD5值就天差地别了
ps : 其实把hash算法当成是一种加密算法,这是不准确的,我们知道加密总是相对于解密而言的,没有解密何谈加密呢,HASH的设计以无法解为目的的。 并且如果我们不附加一个随机的salt值,HASH口令是很容易被字典攻击入侵的。

END


Hash算法的应用 
长按二维码,关注我们吧

以上是关于Hash算法的应用的主要内容,如果未能解决你的问题,请参考以下文章

Java 一致性 Hash 算法在负载均衡中的应用,强烈推荐!

如何从URL获取片段标识符(hash#之后的值)?

哈希(hash) - 哈希算法的应用

重学算法:Hash 算法原理及应用漫谈

hash 算法原理及应用漫谈

一致性hash算法在memcached中的使用