哈希算法
这里说两部分,一部分是密码学上的哈希函数,另一部分是编程上的哈希函数,这俩哈希函数相似但不完全一样 https://www.zhihu.com/question/20820286 密码学HASH函数具有的性质 1. 输入值可以是任意长度,即给什么玩意都可以hash 2. 输出是固定长度,无论给什么玩意输出的长度都是固定的 3. 可以正向计算hash函数,任意给定一个值可以计算其hash值 4. 不可逆,即给定一个输入的hash值,无法计算其输入值,这个无法计算应该是计算能力上的不够,不是理论上的不够 5. 哈希值不存在碰撞,即俩不一样的输入计算得到的俩hash值也不一样
再多看一点,密码学的加密算法 加密算法可以分为三类,对称加密,非对称加密和hash加密 1. 对称加密:加密过程和解密过程是对称的,也是互逆的,原理比较简单 2. 非对称加密:加密过程和解密过程是非对称的,过程都是不可逆的,实现较为复杂,安全性较好,如RSA 3. hash加密:代表的有md5等 接下来说编程上的hash函数,也就是非常常见的dict实现,hash表也叫散列表,是根据键(key)可以直接访问内存中存储位置的数据结构。也就是说,他通过计算一个关于键值的函数,将所需要查询的数据映射到一个位置来进行访问,这加快了查找速度。 hash函数的特点: 1. 确定性,如果两个散列值是不一样的,那么他俩对应的key也不一样 2. 散列碰撞,如果两个散列值是一样的,那么他俩对应的key有可能一样也有可能不一样 3. 不可逆,一个散列值对应着无数的key,所以理论上你并不能知道是哪一个 4. 混淆,修改key的一小部分,得到的散列值会变化很大 由于抽屉原理,hash之后的散列值有可能会发生冲突,需要使用某些算法来解决这些冲突