下面我要发表一下我对哈希的认知,(有不认可,或者需要补充的 欢迎留言 )
一、 什么是哈希(hash)
百度对 哈希的解释:
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash 表现为 键值对, key :value (键 :值)
StudentInfo
二、哈希(hash)的特性
1、不可逆
哈希不单止有数组和编码的功能,还是一种加密的算法,经常用于加密密码、数字签名、文件完整性校验
2、计算速度快
据我理解,
普通查询就是,一个一个遍历,一个一个对比,循环到N次,找到你想要的值,查询速度会很慢,
哈希的 基本就是 键值对,哈希算法存取速度快就快在,查询的时候,直接通过键(key)来找到存放在内存里的值(value)
举个栗(例)子:
普通查询: 我需要去学校里找一个叫张三(张三就是需要查找的值)的同学,然后在学校的名单一个一个找,找到最后可能,找到几个叫张三的,找的速度非常慢
哈希查询: 我需要去学校里找一个叫张三(张三就是需要查找的值)的同学,他的学号是123(在这里学号123就是键),这样,我只需要去到123号对应的班级,找到对应的座位就能找到张三,
三、哈希的用途
- 1、数据校验:
既然将任意长度的字符串转换成固定长度的, 那么冲突就不可避免了, 比如将0-100所有的数字, 映射到0-10这十个数字上, 难免会发生冲突. 一般来说, 计算得出的哈希值越长, 冲突的概率就越低, 比如说, 计算过后, 哈希值为16个字节, 也就是128位, 那么就有2^128个不同的哈希值, 发生哈希冲突的概率为(1/2)^128, 这个概率可以说很低了.
以MD5为例, 以下是经过MD5转换后的值:
引用 烟草的香味的博客这么一段话(哈希算法的用途 - 烟草的香味 - 博客园)
(图1)
(图2)
图1 和图二对比 多了两个感叹号 哈希码就完全不一样了 (失之毫厘,差之千里)
- 2、密码
哈希加密密码后会得到一串字符串,用于和明文串接在一起,称为盐,然后哈希得到密文,
假设某用户的密码是pwd,加上加密盐 123 拼凑在一起就是 pwd123,哈希存入库时,当再次登录的时候,哈希会把 用户输入的密码加上加密盐和数据库存储的密码对比,结果为true时通过验证, 结果为false时,拒绝让你登录
- 3、唯一标识
现在有十万个文件, 给你一个文件, 要你在这十万个文件中查找是否存在. 一个很笨的办法就是把每一文件都拿出来, 然后按照二进制串一一进行对比. 但是这个操作注定是比较费时的.
可以用哈希算法对文件进行计算, 然后比较哈希值是否相同. 因为存在哈希冲突的情况, 你可以在相同哈希值的文件再进行二进制串比较.
- 4、数据存放(哈希表)