1. 哈希函数
哈希函数是指一种能够讲任意数据转换为固定长度编码的一种函数,因为不同数据得到的哈希值可能相同,因此哈希过程一般是不可逆的,哈希函数可以应用于密码加密,哈希存储等方面。
好的哈西函数应该具备以下特点:
- 相同的数据得到的哈希值唯一
- 通过哈希值无法通过反向推导得到源数据
- 源数据发生微小改变,得到的哈希值完全不同,
- 长的字符也能快速的计算出哈希值
- 要尽量避免冲突(不同的数据得到的编码要尽量不同)
2. 哈希加密算法
比如对用户密码的加密,如果使用明文来存储用户密码,那么管理员很容易就能在后台获取用户的密码并登录系统,如果通过哈希函数进行加密,那么管理员在后台只能看到通过哈希函数计算得到的哈希值,并且由于哈希函数不可逆的特性,管理员无法通过哈希函数得到用户密码的明文,从而对用户密码进行加密。
当然,用户一般不会设定太过于复杂的密码,因此黑客可以穷举常用的密码组合并计算相应的哈希值,然后和用户的哈希值进行一一比对,从而获取密码明文;当然实际密码加密过程往往更加复杂,也更难被破解,这里不展开讲。
3. 哈希存储
哈希存储用一句话概括就是:将每个数据通过哈希函数编码成一个二进制编码,然后将这个二进制编码作为地址来保存这个数据
顺序表和链表在查找数据时,都需要从列表的第一个元素开始进行比对,直到检索到目标元素或者检索不到;而哈希存储可以根据源数据直接计算出数据的存储的地址,根据地址直接修改删除或校验数据即可,节省了数据比对的时间。
哈希表适用于那种查找性能要求高,数据元素之间无逻辑关系要求的情况。例如做文件校验或数字签名。当然还有快速查询功能的实现。
3.1 优点
- 哈希存储在数据的查找、删除、修改方面有较高的效率,可以在O(1)内遍历元素;
3.2 缺点
- 哈希是以 key-value的形式存储数据的,因此数据之间没有顺序,无法通过下标访问数据
- 占的空间大,牺牲空间换取了效率
- 当哈希表接近装满的状态时,性能下降得非常严重;因为当哈西表空间不足时需要执行扩容操作且扩容操作非常耗时。例如哈希表的长度是100,现在有第101个数要插入,这时,不仅哈希表的长度可能要扩展到150,且扩展之后所有的数都需要重新rehash。因此在设计哈希表时最好能够提前预知数据量的大小。
4. 哈希函数的其他应用
哈希函数的其他用用还包括: 数据校验、版权校验、大文件分块校验、负载均衡、服务器缩容、服务器扩容、虚拟节点,具体的介绍请参考此文章->什么是 hash? - 腾讯技术工程的回答 - 知乎