08_python_Hash Table

本文介绍了哈希表的概念、散列函数及其在区块链技术中的应用。讲解了Python中散列函数库hashlib,强调了完美散列函数的作用,并探讨了冲突解决策略,如开放定址法和数据项链法。同时,提到了哈希表在实现数据查找的高效性和区块链的去中心化特性。
摘要由CSDN通过智能技术生成

概念

散列

  • 散列
    • 散列表是一种数据的集合,其中的每个数据都通过某种特定的方式进行存储以方便日后的查找
    • 散列表的每一个位置叫做槽,能够存放一个数据项,并以从0开始递增的整数命名。
    • 初始条件下,散列表中是没有任何数据的,即每个槽都是空的,默认值为None
  • 散列函数:某个数据项与存储它的槽之间的映射角做散列函数。
    • 散列函数可以将任意一个数据项存储到集合中并返回一个介于槽命名区间内的,即0与m-1之间的整数
    • 例子:求余散列函数,hash(item)=item%len。简单将要存储的数据与散列表的大小相除,返回余数作为这个数据项的散列值。
    • 负载因子:槽被占据的比例,负载因子=数据项个数/散列表的大小

  • 基于散列的搜索算法的时间复杂度是:O(1)
    • 只需要使用散列函数去计算得到这个数据项对应槽的名字并在这个槽中检查该数据项是否存在即可。
    • 如果所有数据项都在散列函数所规定的位置上,就已经得到了一个时间复杂度为常数量级的搜索算法。
  • 冲突:根据这种求余的散列函数,两个甚至多个数据就需要存储在同一个槽中。
    • 不是致命性错误,可解决。

完美散列函数

  • 对于一组给定的数据项,如果一个散列函数可以将每一个数据项都映射到不同的槽中,那么这样的散列函数角做完美散列函数。
    • 如果已知数据项是固定不变的,就可以构造一个完美散列函数
    • 如果给定一组任意数据项,就没有一种系统的方法来构造一个完美散列函数
  • 方法:扩大散列表的尺寸,直到所有可能的数据项变化范围都被散列表所包含。(浪费存储空间)
  • 目标:冲突数量最少、计算方便、将数据项分配到散列表中的散列函数

函数库hashlib

  • Python自带MD5和SHA系列的散列函数库:hashlib。包括了md5 / sha1 / sha224 / sha256 / sha384 / sha512等6种散列函数
import hashlib
hash1 = "hello world!"
hash1 = hashlib.md5() #声明一个md5对象
hash2 = hashlib.sha1() #声明一个sha1对象
print(hash1.hexdigest())
print(hash2.hexdigest())
d41d8cd98f00b204e9800998ecf8427e
da39a3ee5e6b4b0d3255bfef95601890afd80709
  • 还可以使用update方法来对任意长的数据分部分来计算,这样不管多大的数据都不会有内存不足的问题
    • update方法使用时必须声明encode
import hashlib
m = hashlib.md5()
m.update("hello world!".encode("utf-8"))  
m.update("this is part #2".encode("utf-8"))
m.update("this is part #3".encode("utf-8"))
m.hexdigest()
'a12edc8332947a3e02e5668c6484b93a'

完美散列函数用途

  • 数据文件一致性校验
    • 压缩性:任意长度的数据,得到的“指纹”长度是固定的
    • 易计算性:以原数据计算‘指纹’很容易;反之,则不可能
    • 抗修改性:对原数据的微小变动,都会引起‘指纹’的巨大改变
    • 抗冲突性:已知原数据和‘指纹’,要找到相同指纹的数据(伪造)则非常困难
  • 为每个文件计算其散列值,仅对其散列值即可得知是否文件内容相同
  • 用于网络文件下载完整性校验
  • 用于文件分享系统:网盘中相同的文件可以无需存储多次
  • 加密形式保存密码
  • 仅保存密码的散列值,用户输入密码后,计算散列值并比对
  • 无需保存密码的明文即可判断用户是否输入了正确的密码
  • 防文件篡改:原理同数据文件一致性判断
  • 彩票投注应用

最酷应用:区块链技术

  • 区块链是一种分布式数据库,通过‘工作量证明POW’机制维持运行
    • 通过网络链接的节点
    • 每个节点都保存着整个数据库所有数据
    • 任何地点存入的数据都会完成同步
  • 本质特征:去中心化
    • 不存在任何控制中心、协调中心节点
    • 所有节点都是平等的,无法被控制

  • 区块链由一个个区块block组成,区块分为头head和体body
    • 区块头记录了一些元数据和链接到前一个区块的信息:生成时间、前一个区块(head+body)的散列值
    • 区块体记录了实际数据
  • 区块链不可修改性
    • 由于散列值具有抗修改性,任何对某个区块数据的改动必然引起散列值的变化。
    • 为了不导致这个区块脱离链条,就需要修改所有后续的区块。由于有‘工作量证明(Proof of Work,POW)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值