获取文件哈希值_哈希(hash)是个啥?

我们先说下hash这个词出现的场景。

编程语言里的数据类型:java里的hashmap, python里的哈希表 - dict
负载均衡:一致性哈希算法
文件和程序的版本管理:通过哈希值来判断
用户的密码:我的密码,网站有,会不会被偷?

以上的场景,覆盖了:开发的编码,服务的管控,版本的管理。贯穿于整个互联网项目的周期中。

hash是一系列的算法

特点:能给一大堆不规律的数据,给出长度固定的标签,这些标签的值分散的比较均匀。数据可以变成标签,标签没办法变成数据。

比如:从学校里随机抽取1000个学生,不论是从成绩,家庭收入来进行划分,他们大概率都会成正态分布。毕竟中庸的人最多,这就很不“hash”了。但如果按年纪、班级来分类,会比较平均。这就很”hash”了。

编程语言里的数据类型

因为它均匀分布的特性,就很适合用来做数据存储。

例如:有6个苹果,分别编号「2,27,125,234553,6635,9」要放进抽屉里,方便下次拿出,怎么给抽屉编号。方便拿到需要的苹果。典型的key与value的对应问题。

  • 最好的方式,按数值大小给抽屉编号,但是会有很大的空间浪费。比如2与27之间就会有二十几个空抽屉。
  • 另一种方式就是直接6个抽屉,放6个苹果,要拿多少号的苹果,就一个抽屉一个抽屉找。节约了抽屉,但是翻找东西的时候麻烦了。
  • 还有种方式就是 编码%10 来放苹果。那么 27号苹果在7号抽屉里。125号在5号抽屉里。6635号苹果,因为有冲突,要么也放到5号抽屉里挤一挤,挤不下则放在10+1=11号抽屉里。

这就是通过“hash”的方式来保证更方便的拿到苹果。

当然问题答案和问题在实际并不会如此简单因为数据是会有各种格式的,字符串,浮点…..

还有冲突的问题,两个一样的编号如何放置?每个苹果编码结尾数字都一样怎么办?

负载均衡

这里主要使用一致性哈希算法。还是之前6个编号号的苹果。按照之前的说法,有10个抽屉0-9就可以把这些苹果如下放到抽屉里

二:2,七:27,五:125,三:234553,五:6635,九:9

问题是我们只有一号,三号,八号三个抽屉。

解决方案是:“二:2”我们打算放到二号抽屉里,但是没有这个抽屉,就往后放到三号里面去。那么“五:125”就放到八号抽屉了。“九:9”的话到头了,我们就从头找起。找零号没有…一号,有,放进去。

这样就可以解决苹果放置的问题了。关键的问题是什么呢?如果八号突然没了。那八号的苹果拿出来,接着往后放,找九号抽屉,没有,零号抽屉也没有一号抽屉有,放进去。

这里的例子就是,分布式群集有多个节点,怎么通过键来确定数据存在哪个节点里了。

文件和程序的版本管理

更新系统的时候,我们能看到各种版本号,但是整个程序是有很多小小的部分组成的,哪个文件要不要用新的怎么确认?

假如是分布式系统里,一个服务要分发到多个机器上,更新的时候怎么确定哪些文件要被更新。

有几种方式:

  • 看时间戳,旧的就不要,全用新的。那么问题就是有的旧文件其实还能用。
  • 看版本号,低于这个版本就不要。问题也差不多,版本号低,但是内容有可能一样,覆盖也只是换个名字,没必要。
  • 看文件的hash值。这个hash值,是通过文件内容,很快速的算出来的一个值,内容一样,hash值就一样。只要hash值不同,就说明文件不同,那就更新掉。

可以理解为,是一种很极致的压缩方式,可以把1个G的文件,压缩成32位的数字。但是没办法解压…如同一辆压成铁砣的特斯拉…..这里的hash值,可能是SHA1,SHA2、MD5…这些不同的算法算出来的。

Python的版本控制也开始使用hash值了。
详见《PEP 552 -- Deterministic pycs》 https://www.python.org/dev/peps/pep-0552/

用户的密码

  • 我的某宝账号,里面有几十万,密码会不会被里面的员工偷偷看了?
假如密码是123456,数据库里是存的是它的哈希值“ea8a706c4c34a168”。
这样别人就没办法从数据库里看到你的密码了。
有的网站觉得不安全,会存123456+”特定字符串”的方式在算出哈希值。
那么你的密码可能就变成了“41630d269546335f”。
有人拿到这串字符也猜不出你的密码是123456,是不是觉得安全一些了。
  • 某某站点xx万用户信息泄露,用户密码被公开。
假如你的密码真是123456,发生这种事情,你的密码会很不安全。
因为你的密码太简单了。会被暴力破解,所谓暴力破解就是一个一个常用密码来试。
如果你的密码够复杂,就算信息泄露,你的密码仍然会很安全。
这就是为什么现在的网站都有密码复杂度的提示。

不信的人可以试试破解下“ba34275de232a490”

发送“hash”获取以上字符串的原文。

更多有趣内容敬请关注“码农在中年”公众号 ⬇️

你可能感兴趣的:(获取文件哈希值)