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)