Python番外(0004): 怎么理解哈希(hash)

1. 什么是哈希

Hash,一般翻译为散列、杂凑,或者音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入空间。

如果说咱们常见的加/减/乘/除是最简单的算法,那么哈希算法无非是一个更为复杂一点的算法,它可以输入字符串、数据、文件等,经过哈希运算之后,变成一个固定长度的输出,也就是哈希值。

哈希算法有一个很大的特点,就是不能从结果反向推算出输入,所以又称为不可逆的算法

2. 哈希特性

  • 不可逆

    给定一个输入,可以通过哈希算法得到哈希值,但是没办法从哈希值反向推算出该哈希值对应的输入是什么。

    从这个角度看,哈希算法可以作为一种加密算法。

  • 计算快

    20G的高清电影和一个5K的文本文件复杂度相同,计算量都很小,可以在很短的时间内得出结果。

3. 哈希的用途

  • 密码

    我们日常使用的各种电子密码本质上都是基于hash的,你不用担心支付宝的工作人员会把你的密码泄漏给第三方,因为你的登录密码是先经过 hash+各种复杂算法得出密文后 再存进支付宝的数据库里的。

  • 文件完整性校验

    通过对文件进行hash,得出一段hash值 ,这样文件内容以后被修改了,hash值就会变。 MD5 Hash算法的”数字指纹”特性,使它成为应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。

  • 数字签名

    数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

4. 基于Hash的数据类型有哪些

Python 中基于hash的2个数据类型是字典(dict)和集合(set)。字典的查询速度快,集合的去重特定,都是利用hash来实现的。

4.1 为什么字典查询速度快,且基本不受字典大小的影响

在创建字典时,Python会对字典的每个key进行哈希运算,得到一段固定长度的哈希值。然后,把这些哈希值按照大小排序,存放在一个列表里

当我们使用key去查询字典时,Python先把key哈希运算得到哈希值,然后利用这个哈希值在刚才的有序列表里进行快速查找,找到了key的哈希值在有序列表里的位置,就能定位到该key对应的value所在的位置。

4.2 集合为什么能去重

在我们向集合(set)中存放数据时,都是先经过哈希运算,然后通过得出的哈希值来确定应该存在集合(set)里的哪个位置。如果这个位置已经有值,那么判断新旧值是否相等,如果相等,那就不做额外的操作;如果不相等(或者没有旧值),那么就把新值存在这里。

参考资料:路飞学城

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值