散列
1、数据结构
散列是一种数据结构,一种查找时间复杂度在o(1)的存储结构,依赖于散列函数。
2、散列函数设计方法
一种典型的方法,一般来说我们会使用存储结构的散列表长度作为除数,使用余数方法来获取数据在散列表中的位置,散列表中位置我们称为槽。类似于键值对这种。
3、哈希冲突
这样的话,会存在余数相等的时候,即发生了哈希冲突。数据在该散列函数计算下存储位置和原有数据位置发生冲突。
在数学理论上,完美的散列函数是不存在的。但是在工程界,我们是可以设计出完美的散列函数的。
4、典型哈希函数
MD5函数和SHA函数。
MD5函数广泛用于文件数据校验一致性上,在云盘存储文件只需要云系统计算出该文件的哈希值,然后存储,如果发现其他云客户想存储同一份文件,在整个数据库中查找,如果发现一样的,那么只需要把客户请求的响应链接上数据库中已经存储好的文件位置,也就是哈希值。无序客户在进行上传存储操作,1-2s即可完成云上上传。
5、区块链技术
区块链本质上是分布式数据库。去中心化,每个节点都会有整个数据库的数据同步。
区块链由一个个block组成,每个block由一个头和体组成,头记录一些元数据和链接到前一个区块的信息。比较类似于反向链表。
由于上述链表的特点,所以散列值具备很强的抗修改特性。如果修改一个数据的位置可能需要全网51%以上的算力。
6、冲突解决方案
1、解决冲突的一份方法就是寻找散列表中的空槽,开放定址技术。(rehashing)
向后逐个槽寻找的方法称为开放定址技术中的线性探测。
为了避免冲突数据聚集在某一个槽附近,可以使用跳跃式探测,使用skip值。
2、解决冲突另外一个方法就是使用数据项链Chaining。
也就是说把存储单个数据的槽扩展为数据项集合(或者说对数据项链表的引用)
这样散列表中每个槽都可以容纳多个数据项,如果有散列冲突发生,只需要把数据项添加到数据集合中即可,相应的风险就是数据项查找时间也会相应增加。
python中的ADT就是字典。