什么是区块链?
区块链是一个记录列表,通常称为记账本,它利用密码学元素以开放、防篡改的方式存储交易。每个“块”代表代表一个新的交易分组,并包含三个关键组件:
数据:每个区块中存储的信息取决于区块链的类型。例如,许多加密货币(如比特币)存储交易详细信息,如发送方、接收方和金额。
哈希:一个块的哈希是一个唯一的字符串,用于识别和区分它与其他块。
前一个块的哈希:后续块也存储前一个块的哈希,创建所谓的“区块链”。
区块链在防止篡改和提供对添加到链中的块的公开验证方面是独一无二的。如果一个块被修改,它的哈希值会发生变化,并且所有后续块不再指向正确的哈希值,从而使它们失效。不法分子需要遍历所有以下区块并重新计算其哈希值以修改区块链。
但是,区块链使用称为工作量证明的东西来防止这种情况发生。工作量证明使用一种分布式共识形式在将区块添加到链上之前对其进行验证。这减慢了块验证过程(通常每个添加到链中的块需要几秒钟到几分钟的时间),使恶意行为者无法更改块并重新验证链中的后续块。
一.Hash构造函数的方法
1.直接定址法:
直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址,即:H(k)=k或H(k)=a×k+b;(其中a,b为常数)
2.数字分析法:
假设关键字集合中的每个关键字都是由s位数字组成(u1,u2,…,us),分析关键字集中的全体,并从中提取分布均匀的若干位或它们的组合作为地址。
数字分析法是取数据元素关键字中某些取值较均匀的数字位作为哈希地址的方法。即当关键字的位数很多时,可以通过对关键字的各位进行分析,丢掉分布不均匀的位,作为哈希值。它只适合于所有关键字值已知的情况。通过分析分布情况把关键字取值区间转化为一个较小的关键字取值区间。
3.折叠法:
将关键字分割成若干部分,然后取它们的叠加和为哈希地址。两种叠加处理的方法:移位叠加:将分割后的几部分低位对齐相加;边界叠加:从一端沿分割界来回折叠,然后对齐相加。
所谓折叠法是将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位),这方法称为折叠法。这种方法适用于关键字位数较多,而且关键字中每一位上数字分布大致均匀的情况。
折叠法中数位折叠又分为移位叠加和边界叠加两种方法,移位叠加是将分割后是每一部分的最低位对齐,然后相加;边界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。
二、 常见解决哈希冲突的方法
1.线性探查法
当我们往哈希表中插入数据时,如果某个数据经过哈希函数哈希之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找,看是否有空闲位置,直到找到为止。
2.双重散列方法
所谓双重散列,意思就是不仅要使用一个散列函数,而是使用一组散列函数hash1(key),hash2(key),hash3(key)...先用第一个散列函数,如果计算得到的存储位置已经被占用,再用第二个散列函数,依次类推,直到找到空闲的存储位置。
3.链表法
链表法是一种更加常用的散列冲突解决办法,相比开放寻址法,它要简单很多。在散列表中,每个位置对应一条链表,所有散列值相同的元素都放到相同位置对应的链表中。