哈希(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”获取以上字符串的原文。

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

发布了21 篇原创文章 · 获赞 0 · 访问量 806

猜你喜欢

转载自blog.csdn.net/liufeng778/article/details/105136594