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. js设置百分比保留两位小数

      CreateTime--2017年8月23日11:03:31Author:Marydon js设置百分比保留两位小数 错误用法: var percent = (num1/num2) * 100%; ...

  2. 仿网易/QQ空间视频列表滚动连播炫酷效果

    代码地址如下:http://www.demodashi.com/demo/11201.html 一.准备工作 AndroidStudio 开发环境 需要下载七牛的开源播放器SDK 本例子实现了仿网易/ ...

  3. poj - 1953 - World Cup Noise(dp)

    题意:n位长的01序列(0 < n < 45),但不能出现连续的两个1,问序列有多少种. 题目链接:id=1953" target="_blank">h ...

  4. 关于UML图形/图示数量总结

    http://www.uml.org/ 第一种说法: UML - Unified Modeling Language UML 共定义了9种图,包括4种结构图和5种形为图: //4种结构图: 类图 对象 ...

  5. python selenum ---如何定位一组元素

    使用findElements方法定位一组对象 定位一组对象一般用于以下场景: · 批量操作对象,比如将页面上所有的checkbox都勾上 · 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象 ...

  6. ITIL学习心笔记总结

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

  7. Mac OS 下安装mysql环境

    传送门:Mac下安装与配置MySQL   mac 上怎么重置mysql的root的密码? 一.下载mysql 进入官方下载地址:https://www.mysql.com/downloads/ 1.找 ...

  8. linode下更换内核(debian,ubuntu,centos)

    1.首先到这个网址下载你需要得内核文件,以genric:http://kernel.ubuntu.com/~kernel-ppa/mainline/ 如果系统是 64 位,则下载 amd64 的 li ...

  9. twemproxy源码分析1——入口函数及启动过程

    最近工作中需要写一个一致性哈希的代理,在网上找到了twemproxy,结合网上资料先学习一下源码. 一.Twemproxy简介 Twemproxy是memcache与redis的代理,由twitter ...

  10. 使用command对象添加删除查询记录

    private void button1_Click(object sender, EventArgs e) { //实例化数据库连接对象 SqlConnection sqlcon = new Sql ...