Hash 也称散列、哈希,对应的英文都是 Hash。
把任意长度的输入,通过 Hash 算法变成固定长度的输出。这个映射的规则就是对应的 Hash 算法,而原始数据映射后的二进制串就是哈希值。计算 hash 值迅速且 hash 值冲突概率要小。两个知识
抗碰撞能力
抗篡改能力
即如果遇到了 hash 冲突 需要解决的时候应该怎么处理,比较常用的算法是链地址法和开放地址法。

开放地址法是指大小为 M 的数组保存 N 个键值对,其中 M > N。
我们需要依靠数组中的空位解决碰撞冲突。基于这种策略的所有方法被统称为**“开放地址”哈希表**。
对于开放寻址冲突解决方法,除了线性探测方法之外,还有另外两种比较经典的探测方法:
假设散列长为 8,散列函数 H(K)=K mod 7,给定的关键字序列为 {32,14,23,2, 20}


每次 git 提交后都有一个 commit id,比如:
19d02d2cc358e59b3d04f82677dbf3808ae4fc40
就是一次 git commit 的结果,那么这个id是如何生成出来的呢?查阅了相关资料,使用如下代码可以进行查看:
printf "commit %s\0" $(git cat-file commit HEAD | wc -c); git cat-file commit HEAD
git的 commit id 主要包括了以下几部分内容:Tree 哈希,parent 哈希、作者信息和本次提交的备注。针对这些信息进行SHA-1 算法后得到值就是本次提交的commit id。简单来讲,就是对于单次提交的头信息的一个校验和。

Linux kernel 开创者和 Git 的开发者——Linus 说,Git 使用了 sha1 并非是为了安全性,而是为了数据的完整性;它可以保证,在很多年后,你重新 checkout 某个commit 时,一定是它多年前的当时的状态,完全一摸一样,完全值得信任。

示例:
在应对业务大用户量参与时,都会使用分库分表,针对用户的 openid 进行 hashtime33取模,就可以得到对应的用户分库分表的节点了。

如上图所示,这里其实是分了10张表,openid计算后的hash值取模10,得到对应的分表,在进行后续处理就好。
一致性 hash 概念
一致性hash的基本原理是将输入的值 hash 后,对结果的 hash 值进行 2^32 取模,这里和普通的 hash 取模算法不一样的点是 在一致性 hash 算法里将取模的结果映射到一个环上。
示例
初始情况如下:
用户1的数据在服务器 A 里,用户 2、3 的数据存在服务器 C 里,用户 4 的数据存储在服务器 B 里。
下面来看一下当服务器数量发生变化的时候,相应影响的数据情况:
服务器缩容
服务器 B 发生了故障,进行剔除后,只有用户 4 的数据发生了异常。这个时候我们需要继续按照顺时针的方案,把缓存的数据放在用户 A 上面。

服务器扩容
服务器扩容以后,新增了一台服务器 D,位置落在用户 2 和 3 之间。按照顺时针原则,用户 2 依然访问的是服务器 C 的数据,而用户 3 顺时针查询后,发现最近的服务器是 D,后续数据就会存储到 d 上面。

虚拟节点
这只是一种理想情况,实际使用中,由于服务器节点数量有限,有可能出现分布不均匀的情况。这个时候会出现大量数据都被映射到某一台服务器的情况,如下图左侧所示。
为了解决这个问题,我们采用了虚拟节点的方案。虚拟节点是实际节点(实际的物理服务器)在 hash 环上的复制品,一个实际节点可以对应多个虚拟节点。虚拟节点越多,hash 环上的节点就越多,数据被均匀分布的概率就越大。
如右图所示,B、C、D 是原始节点复制出来的虚拟节点,原本都要访问机器D的用户1、4,分别被映射到了B,D。通过这样的方式,起到了一个服务器均匀分布的作用。
simHash是google用于海量文本去重的一种方法,它是一种局部敏感hash。
详情百度
GeoHash将地球作为为一个二维平面进行递归分解。每个分解后的子块在一定经纬度范围内拥有相同的编码。
参考链接
应用
布隆过滤器被广泛用于黑名单过滤、垃圾邮件过滤、爬虫判重系统以及缓存穿透问题。
原理
百度