1.什么是hash算法
Hash(散列、杂凑)算法,是把任意长度的输入通过特定的算法变换成固定长度的输出,输出的值就是hash值。这个特定的算法就叫hash算法,hash算法并不是一个固定不变的算法。只要是能达到这个目的的算法都可以说hash算法。例如MD5,SHA,String.hashcode()都是hash算法。另外不同的输入可能会得出相同的hash值,那么这种现象称为hash碰撞,无论是采用那种hash算法,hash碰撞都是不可避免的,我们只能通过改进hash算法,把出现碰撞的概率降低。PS:hash这个词在因为英语中的意思是剁碎的食物,反应在计算机领域的意思大概就是把任意的数据切割打碎,输出固定长度的数据,所以通过hash这个单词也能大概理解hash算法的意思。
2.hash算法的应用
2.1 哈希表
由于用途的不同,hash在数据结构中的含义和密码学中的含义并不相同。所以在这两种不同的领域里,算法的设计侧重点也不同。在数据结构中,我们利用hash值来建立以key-value形式的数据结构——哈希表(散列表),使用哈希表我们可以实现对特定value的快速查找,时间复杂度为O(1);如果是普通的数组或者链表的数据结构,只能通过遍历的方式对特定value值的查找,时间复杂度为O(n);如果数组是有序的,那么可以通过二分查找,或者即使使用平衡二叉树的数据结构,时间复杂度为O(logN),都不如哈希表高效。但如果hash值出现频繁的碰撞,哈希表的查找效率就会降低,最坏的情况就会变成数组或者链表,复杂度降为O(n),因此数据结构中的hash算法应该要能均匀的输出hash值,使key能均匀的分布在不同的桶中。

2.2 密码学
hash算法也可以理解为一种压缩映射,把任意长度的信息压缩成固定长度,在密码学上把经过hash算法计算压缩后的数据称为信息摘要。
我们可以通过对比信息摘要来检验数据的完整性,防止数据在传输过程中被篡改。例如在http协议中传递参数a=1&b=2&hash=xxx,我们通过计算参数a=1&b=2+privateKey(一个双方都知道的密钥)的hash值,并将这个hash值也一并传递,那么接收方通过重新计算参数的hash值并与传递过来的hash进行对比,如果不一致那么就说明参数在传递过程中被人篡改了。所以密码学中的hash算法要有很强的抗篡改能力,对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。

到底什么是hash的更多相关文章

  1. 到底什么是哈希Hash?

    知识点总结 ---------------------------------------------------------------------------------------------- ...

  2. 到底什么是哈希Hash?

    有次面试被问到这个问题? 我说是经过运算的一串字符串,这个回答显然是让人不满意,连自己都不满意! 但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统 ...

  3. 分布式一致性Hash

    转载: https://blog.csdn.net/bntX2jSQfEHy7/article/details/79549368 为什么要有Hash一致性算法?就像以前介绍为什么要有Spring一样, ...

  4. 数据结构中的hash

    最近接触数据结构的时候突然发现一直在使用哈希表,哈希算法.那么到底什么是哈希(hash).查找资料发现一个比较有意思的解释,在此分享一下. 人家说的很好我就直接粘过来. =============== ...

  5. 一致性HASH算法在分布式应用场景使用

    其实不管redis还好,Mysql也好 这种数据存储介质,在分布式场景中都存在共同问题:即集群场景下服务路由.比如redis集群场景下,原本我们分3主3从部署.但万一有一天出现访问量暴增或其中一台机器 ...

  6. hadoop+海量数据面试题汇总(二)

    何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储.处理.操作.何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存. 那解决办法呢 ...

  7. july教你如何迅速秒杀掉:99%的海量数据处理面试题

    作者:July出处:结构之法算法之道blog 以下是原博客链接网址 http://blog.csdn.net/v_july_v/article/details/7382693 微软面试100题系列 h ...

  8. Java的容器类

    程序总是根据运行时才知道的某些条件去创建新对象.需要在任意时刻和任意位置创建任意数量的对象. 如果你想保存一组基本数据类型数据,建议使用数组,但是数组有固定的尺寸. 一般情况下,你在写程序时并不知道将 ...

  9. C++大数据处理

    转:http://blog.csdn.net/v_july_v/article/details/7382693 作者:July出处:结构之法算法之道blog 前言 一般而言,标题含有“秒杀”,“99% ...

随机推荐

  1. ios8 横屏

    iOS8横屏时,状态栏会消失 使用以下代码可以阻止状态栏消失 override func prefersStatusBarHidden() -> Bool { return false }

  2. Layui 弹出层组件——layer的模块化开发实例应用

    Layui 弹出层组件——layer的模块化开发实例应用 1.首先在package.json中引入layer组件依赖 2.在源码中应用这个依赖 3.在源码中编写代码应用此组件 4.效果验证:点击日历上 ...

  3. Js日常笔记之数组

    1.Array构造函数有一个很大的问题,就是不同的参数,会导致它的行为不一致,es6好像专门为此对数组有升级 因此,不建议使用new Array生成新数组,直接使用数组字面量[...]是更好的做法. ...

  4. ITIL学习心笔记总结

    四:价值: 被验证的价值1:革新意识---管理也是第一生产力 被验证的价值2:统一思路---这不是一个人的战斗 被验证的价值3:体系的价值---‘新木桶原理’ ITSM的实施经验表明,“”一流的工程师 ...

  5. 为centos桌面增加在右键中打开终端

    万万没有想到这只是安装一个程序的总是,而不是配置的问题.注意要用root身份才能安装软件 1. yum -y install nautilus-open-terminal 2. reboot

  6. Phone

    User-Agent Switcher for Chrome EditThisCookie cornerstone SVN

  7. springboot+springAOP实现数据库读写分离及数据库同步(MySQL)----最新可用2019-2-14

    原文:https://blog.csdn.net/wsbgmofo/article/details/79260896 1,数据源配置文件,如下 datasource.readSize=1spring. ...

  8. 记一次kafka客户端NOT_COORDINATOR_FOR_GROUP处理过程

    转发请注明原创地址:https://www.cnblogs.com/dongxiao-yang/p/10602799.html 某日晚高峰忽然集群某个大流量业务收到lag报警,查看客户端日志发现reb ...

  9. Centos安装ruby--jekyll

    想要使用gem install 安装jekyll,执行发现没有gem这个命令,那就需要先安装gem了 yum list '*ruby*' 修改gem源,使用淘宝的源: gem sources --re ...

  10. C运行库和VC对应关系

    ## C运行库和VC对应关系----------------------------------------------------------------Msvcr60.DLL -- VC6Msvc ...