哈希算法

栏目: 编程工具 · 发布时间: 5年前

内容简介:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,得到的二进制值串就是哈希值。 一个hash算法需要满足几点要求:通过一个较短的二进制串表示一个很大的数据。如果想从海量图库中查找一张图片。因为图片元数据(名称、地点等信息)可能会相同没办法唯一标识一张图片。因此我们可以从图片的二进制码串(任何文件在计算中都可以表示成二进制码串)前中后三个部位取100B数据,把这300Byte合并通过哈希算法(如MD5)得到一个哈希值作为图片的唯一标识。在根据前边学的查找相关的算法,可以把图片的唯

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,得到的二进制值串就是哈希值。 一个hash算法需要满足几点要求:

  • 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
  • 对输入数据非常敏感,哪怕原始数据只修改了一个bit,最后得到的hash值也大不相同;
  • 散列冲突的概率很小,不同的原始数据,哈希值相同的概率非常小;
  • 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速的计算出哈希值。

哈希算法的应用

  1. 安全加密
  • MD5(消息摘要算法)、SHA(安全散列)、DES(数据加密标准)、AES(高级加密标准)等。
  • 哈希算法无法做到零冲突(鸽巢原理):哈希值是固定长度的数据串(如MD5:128bit)因此哈希值的数量也是有限的2^128。对于无限的数据进行哈希算法得到有限的哈希值,肯定会有冲突的。但如2^128已经是个很庞大的数据范围了,想破解非常之难了。
  • 实际开发中选取加密算法,要衡量破解难度和计算时间。
  1. 唯一标识

通过一个较短的二进制串表示一个很大的数据。

如果想从海量图库中查找一张图片。因为图片元数据(名称、地点等信息)可能会相同没办法唯一标识一张图片。因此我们可以从图片的二进制码串(任何文件在计算中都可以表示成二进制码串)前中后三个部位取100B数据,把这300Byte合并通过哈希算法(如MD5)得到一个哈希值作为图片的唯一标识。在根据前边学的查找相关的算法,可以把图片的唯一标识作为key,和相应图片文件在图库中的路径信息都存储在散列表中,在散列表中通过key可以在O(1)下查找到图片。

  1. 数据校验 数据在网络中进行传输,很有可能被恶意修改,导致文件无法打开,甚至导致电脑中毒。如何检测数据是否被篡改呢?哈希算法对数据很敏感,只要数据有一点变化生成的哈希值就会变化,因此可以对数据进行哈希,得到哈希值。当收到文件时,再对文件进行相同哈希函数计算得到哈希值和原始哈希值进行比较,不同则说明数据被篡改了。

  2. 散列函数 之前的散列函数也是哈希算法的一种应用,只不过它更关注散列后的值是否平均分布,散列函数执行的快慢,因此散列函数一般比较简单,追求效率。

对用户密码进行传输如何做更安全呢? 仅对密码进行MD5/SHA加密还是有很大的可能被攻破,因为有的用户设置的密码太简单(如:654321等)攻击者可以进行字典攻击:字典中存储攻击者可能猜到的各种密码组合和对应加密后的数据串,这样拿到加密后的数据,在字典中查找,很可能就破解了。

针对字典攻击,可以引入一个盐,和用户密码组合在一起增加密码复杂度,在进行哈希算法加密,这样就提高了破解难度。

哈希算法解决分布式问题

  1. 负载均衡 如何把同一个客户端上的所有请求都路由到同一个后端服务器上呢?
  • 最简单的方法:维护一张客户端IP和服务器编号的映射关系表。客户端每次发请求,找到表中对应的服务器编号,请求。但是这种方式有几个弊端:
    • 客户端很多,表会很大,浪费内存空间;
    • 客户端上线下线、服务器扩容缩容都会导致映射关系失效,表的维护成本高。
  • 哈希算法:对客户端的IP地址计算哈希值,再将哈希值与服务器编号列表的大小进行取模,得到的值加上服务器编号起始值就得到了服务器编号。这样就保证了同一个IP最终计算得到的编号值都是一样的(并不需要保证服务器一直都是同一个)。
  1. 数据分片

如果有1T的日志文件,记录了用户的搜索关键字,如何快速统计出每个关键词被搜索的次数呢?

最开始想到了桶排序,把相同的数据放同一个桶中,最后统计桶中数据个数。但这样就有两个问题:

  • 有1T的数据,一起取出来计算机内存根本放不下,而且还要为桶开辟空间。
  • 如何把一个数据放到一个桶中呢?通过哪种映射关系呢?

结合上述问题的到的处理方法:一个计算机放不下,可以用多台计算机并发处理。这样我们可以把每台计算机看做一个桶。那么如何把数据放到对应的计算机中呢?想到了哈希算法:对每个数据计算哈希值,然后再根计算机编号列表大小n取模的计算机编号,数据就放到对应编号的计算机中。这样相同数据肯定放在同一个计算机中。在每个计算机在分别计算相同数据出现的次数,最后在合并结果即可。

这种思想(MapReduce)结合了桶(数据分片)、哈希算法、散列函数(取模对应列表index)。

如果再1亿张图片中找一张图片,也可以用上述的思想来解决。

针对这种海量数据问题的处理,都可以采用多机分布式处理,借助这种分片思路可以突破单机内存、CPU等资源的限制。

  1. 分布式存储 数据分片时如果增加了一台计算机,那么原本散列函数得到的结果就都失效了,需要全部数据重新计算一次。需要一致性哈希算法。(待补充)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

群体智能

群体智能

James Kennedy、Russell C Eberhart、Yuhui Shi / 人民邮电出版社 / 2009-2-1 / 75.00元

群体智能是近年来发展迅速的人工智能学科领域.通过研究分散,自组织的动物群体和人类社会的智能行为, 学者们提出了许多迥异于传统思路的智能算法, 很好地解决了不少原来非常棘手的复杂工程问题.与蚁群算法齐名的粒子群优化(particle swarm optimization, 简称PSO)算法就是其中最受瞩目,应用最为广泛的成果之一. 本书由粒子群优化算法之父撰写,是该领域毋庸置疑的经典著作.作者......一起来看看 《群体智能》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具