Document

简单认识Hash(哈希)

从事过计算机行业的人,多多少少都会听说过这个概念,尤其是用过redis数据库的人,但是又对其很模糊,那么到底什么是Hash呢?Hash又可以做什么?

具体操作以及具体操作讲解可参考 :https://www.zhihu.com/question/26762707/answer/40119521

定义

Hash一般翻译为散列,还有音译为哈希,通过百度以及谷歌都没有直接找到Hash的定义,而是找到了一些相关的概念,哈希算法,哈希函数,哈希表等概念。

hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)
也就是说,无论数据块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 并不是不能反向解析。。。。。

 

posted @ 2020-09-07 11:13  苏什么苏  阅读(985)  评论(0编辑  收藏  举报