简单认识Hash(哈希)
从事过计算机行业的人,多多少少都会听说过这个概念,尤其是用过redis数据库的人,但是又对其很模糊,那么到底什么是Hash呢?Hash又可以做什么?
具体操作以及具体操作讲解可参考 :https://www.zhihu.com/question/26762707/answer/40119521
定义
Hash一般翻译为散列,还有音译为哈希,通过百度以及谷歌都没有直接找到Hash的定义,而是找到了一些相关的概念,哈希算法,哈希函数,哈希表等概念。
也就是说,无论数据块m有多大,其输出值h为固定长度。到底是什么原理?将m分成固定长度(如128位),依次进行hash运算,然后用不同的方法迭代即可(如前一块的hash值与后一块的hash值进行异或)。如果不够128位怎么办?用0补全或者用1补全随意,算法中约定好就可以了。
我所理解的哈希是指一个过程,这个过程就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值, 不同hash算法所得出hash值也是有很大区别。这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。
哈希函数、算法
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法 ---《数据结构与算法分析》
1.什么是hash
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值
1.如果把hash算法比喻为一座工厂
2.那传给hash算法的内容就是原材料
3.生成的hash值就是生产出的产品
2.为何要用hash算法
hash值/产品有三大特性:
1.只要传入的内容一样,得到的hash值必然一样
2.只要我们使用是hash算法固定,无论传入的内容有多大,得到的hash值的长度是固定
3.不可以用hash值逆推出原来的内容
基于1和2可以在下载文件时做文件一致性校验
基于1和3可以对密码进行加密
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
特点
- 如果两个哈希值是不相同的(根据同一函数),那么这两个散列值的原始输入一定是不相同的。
- 如果两个哈希值相同,两个输入值很可能(极大概率)是相同的,但也可能不同,这种情况称为“哈希碰撞”
- 抗篡改能力:对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。
- 它是一种单向函数是“非对称”的,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。
python中应用 Hash 加密
import hashlib 两种传值方式: 1.造出hash工厂 m=hashlib.md5() #hashlib.sha512 :可以选择不同的算法加密,不同的算法的加密结果的长度也会不一样 2.运送原材料 m.update('你好啊’.encode('utf-8')) 3.产出hash值 print(m.hexdigest) 1. 1.造出hash工厂 m=hashlib.md5('你'.encode('utf-8')) 2.运送原材料 m.update('你好啊’.encode('utf-8')) 3.产出hash值 print(m.hexdigest) 应用一:文件一致性校验 1.造出hash工厂 m=hashlib.md5() 2.运送原材料 with open(r'E:\01.mp4','rb') as f: for line in f: m.update(line) 3.产出hash值 print(m.hexdigest) 应用二:密码加密 m=hashlib.md5() m.update('天王盖地虎'.encode('utf-8')) #添加个暗号,提升密码复杂度 m.update(password.encode('utf-8')) print(m.hexdigest()) 加密模块另一个加密模块 hmac import hmac m=hmac.new('小鸡炖蘑菇'.encode('utf-8')) #用法跟hash一样的用法,但必须要传个值,增加密码难度性 m.update('hello'.encode('utf-8')) print(m.hexdigest())
Hash 并不是不能反向解析。。。。。