发布时间:2024-02-03 15:00
我们先说下hash这个词出现的场景。
编程语言里的数据类型:java里的hashmap, python里的哈希表 - dict
负载均衡:一致性哈希算法
文件和程序的版本管理:通过哈希值来判断
用户的密码:我的密码,网站有,会不会被偷?
以上的场景,覆盖了:开发的编码,服务的管控,版本的管理。贯穿于整个互联网项目的周期中。
hash是一系列的算法
特点:能给一大堆不规律的数据,给出长度固定的标签,这些标签的值分散的比较均匀。数据可以变成标签,标签没办法变成数据。
比如:从学校里随机抽取1000个学生,不论是从成绩,家庭收入来进行划分,他们大概率都会成正态分布。毕竟中庸的人最多,这就很不“hash”了。但如果按年纪、班级来分类,会比较平均。这就很”hash”了。
编程语言里的数据类型
因为它均匀分布的特性,就很适合用来做数据存储。
例如:有6个苹果,分别编号「2,27,125,234553,6635,9」要放进抽屉里,方便下次拿出,怎么给抽屉编号。方便拿到需要的苹果。典型的key与value的对应问题。
这就是通过“hash”的方式来保证更方便的拿到苹果。
当然问题答案和问题在实际并不会如此简单因为数据是会有各种格式的,字符串,浮点…..
还有冲突的问题,两个一样的编号如何放置?每个苹果编码结尾数字都一样怎么办?
负载均衡
这里主要使用一致性哈希算法。还是之前6个编号号的苹果。按照之前的说法,有10个抽屉0-9就可以把这些苹果如下放到抽屉里
二:2,七:27,五:125,三:234553,五:6635,九:9
问题是我们只有一号,三号,八号三个抽屉。
解决方案是:“二:2”我们打算放到二号抽屉里,但是没有这个抽屉,就往后放到三号里面去。那么“五:125”就放到八号抽屉了。“九:9”的话到头了,我们就从头找起。找零号没有…一号,有,放进去。
这样就可以解决苹果放置的问题了。关键的问题是什么呢?如果八号突然没了。那八号的苹果拿出来,接着往后放,找九号抽屉,没有,零号抽屉也没有一号抽屉有,放进去。
这里的例子就是,分布式群集有多个节点,怎么通过键来确定数据存在哪个节点里了。
文件和程序的版本管理
更新系统的时候,我们能看到各种版本号,但是整个程序是有很多小小的部分组成的,哪个文件要不要用新的怎么确认?
假如是分布式系统里,一个服务要分发到多个机器上,更新的时候怎么确定哪些文件要被更新。
有几种方式:
可以理解为,是一种很极致的压缩方式,可以把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,是不是觉得安全一些了。
假如你的密码真是123456,发生这种事情,你的密码会很不安全。
因为你的密码太简单了。会被暴力破解,所谓暴力破解就是一个一个常用密码来试。
如果你的密码够复杂,就算信息泄露,你的密码仍然会很安全。
这就是为什么现在的网站都有密码复杂度的提示。
不信的人可以试试破解下“ba34275de232a490”
发送“hash”获取以上字符串的原文。
更多有趣内容敬请关注“码农在中年”公众号 ⬇️