散列(Hashing) 的基本概念

查找的次数降低到常数级别。即事先知道要查找的数据项应该出现在什么位置。

散列表(hash table, 哈希表),表中的每一个存储位置,成为槽(slot),可以用来保存数据项,每个槽有一个唯一的名称。有利于快速的查找定位。

散列函数:实现从数据项到存储槽名称的转换的函数。
常用的散列方法是求余数,将数据项除以散列表的大小,得到的余数作为槽号。

完美散列函数:如果一个散列函数能把每个数据项映射到不同槽中,成为完美散列函数。
但如果数据经常变动,则不一定总是完美的,会发生冲突

python的散列函数库hashlib,包括了MD5和SHA系列的散列函数。

>>>import hashlib
>>>hashlib.md5("hello world!".encode("utf-8")).hexdigest()
'fc3ff98e8c6a0d3087d515c0473f8677'
>>>hashlib.sha1("hello world!".encode("utf-8")).hexdigest()
'430ce34d020724ed75a196dfc2ad67c77772d169'
#如果想输入任意长度的数据,可以用update依次输入进去
>>>m=hashlib.md5()
>>>m.update("hello world!".encode("utf-8"))
>>>m.update("nihao".encode("utf-8"))
>>>m.update("piajun".encode("utf-8"))
>>>m.hexdigest()
'292ac436baa8a8793115d13529d5f184'

完美散列函数应用

  • 数据文件一致性判断
  • 对每个文件计算其散列值,仅对比散列值即可直到文件内容是否相同
  • 用于网络文件下载完整性校验
  • 用于文件分享系统(网盘)中相同文件无需存储多次
  • 加密形式保存密码
  • 仅保存密码的散列值,用户输入密码后计算散列值并比对
  • 无需保存密码的明文
  • 防文件篡改
  • 彩票投注,验证是否作弊

区块链技术
去中心化:不存在任何控制中心,所有节点都是平等的,无法被控制
不可修改性:任何对某个区域数据的改动必然引起散列值的变化

冲突解决方案

  1. 开放地址 open addressing 冲突后,向后搜索空槽然后保存
  2. 数据项链 Chaining 把对一个槽存储数据项的集合

你可能感兴趣的:(数据结构与算法)