Bloom Filter 的数学原理和在区块链里的应用

布隆过滤器(Bloom Filter),可以不用知道一个块里的所有交易数据,而只用下载很少的数据,就能知道一个交易是否在一个块里(如果在块里,那么一定告诉你在块里,如果不在块里,有很小概率告诉你在块里). 算法的设计的还是很妙的,值得去学习一下这种概率型算法思维。

原理:

Step1 :

假设一个块有n个交易,那么做一个m=2*n长度的bit array,这里称为A

用一个hash函数把交易映射到A的响应位置x=hash[transaction], 并设置A[x]=1。并不处理冲突的情况。

那么查交易的时候,如果交易在块里的话A[hash[transation]]一定为1,

如果不在块里的话,A[hash[transaction]]为1的概率<=1/2 (因为A的长度m=2*n)。

现在这个算法的问题是1/2的误报概率太大了。

Step2: 

做多个bit array, A1, A2 ... Ak. 

先看两个bit array的情况: 用个两个不同的hash函数来填充A1,A2.

对一笔不在块里的交易,A1,A2相对应位置都为1的概率是1/2*1/2= 1/4,优化了很多

假设用10个bit array, 那么误报的概率为(1/2)^10 = 1/1024,是一个非常小的数字。

也就是说为了达到p的误报率,就用log2(1/p)个bit array就可以了

通过记录这些很少的hash数据,比特币的轻钱包可以快速定位交易在哪个块里。

你可能感兴趣的:(Bloom Filter 的数学原理和在区块链里的应用)