本文定位于献给小白的科普文章,故会避开具体的hash 算法的具体实现细节
hash 是什么
hash 一般译作“散列”,音译“哈希”,跟它相关的概念我们先抛出两个,hash fuction (哈希函数/散列函数),hash values/hash codes/hashes(哈希值/散列值/哈希码/散列码)。
哈希函数是这样一个函数,它可以把一个任意长度的数据(记为data_A)映射成一个固定长度的数据(记为fixed_A),而我们把哈希函数的运算结果(即fixed_A)叫做哈希值。
再来解释一下什么叫做hash crash(哈希碰撞/哈希冲突),如果哈希函数把两个不同的数据映射成了同一个固定长度的数据,那么就叫做发生了哈希冲突。
hash 可以用来做什么
1. hash table
hash table(哈希表)是一个在计算机领域里广泛应用的支持快速查找(通常时间复杂度为O(1))的数据结构。
hash values | fixed_A | fixed_B | fixed_C | ... |
data | data_A | data_B | data_C | ... |
举例来说,如果可以找到一个这样的哈希函数,这个函数可以把一个数据映射成存储这个数据的地址的话,那么我们就可以利用这个哈希函数,生成一个哈希表(也就是一个数据和数据存储位置的一个映射表)。当我们需要查询某一个数据的时候,我们通过计算这个数据的哈希值就直接得到了这个数据的存储位置,就可以直接访问了。
note:
哈希表作为一种数据结构,哈希冲突的问题是不可避免的,所以如果有可能发生哈希碰撞的话,就必须要做好相应的冲突处理措施,比如可以选用开放定址,再哈希,链地址,建立公共溢出区这些方法进行处理。
2. 密码学中的hash
密码学中的MD5,SHA1,SHA2其实都是可以认为是一种哈希函数,它们共同的特征是可以很容易的把原始数据映射成一串哈希码,但是不能根据这串哈希码来反推出原始数据,也不能在合理的时间内再找出另一个具有相同哈希码的原始数据。其实可以认为这些哈希函数是为原始数据生成了一个独一无二的指纹。
note:
这个特性可以用于各种需要校验的场景,比如下载完文件可以用md5验证文件的完整性,可以用来加密登录密码等等