【golang】海量数据去重-布隆过滤器

Python016

【golang】海量数据去重-布隆过滤器,第1张

在做域名爆破中,遇到了把一个300G的子域名json文件进行去重,一开始是考虑使用字典进行去重,但是数据量大了,会造成内存泄露。看网上资料介绍了一种方案,就是使用布隆过滤器

布隆过滤器是一种数据结构,概率型数据结构,特定是高效插入和查询,可以用来告诉你“某一值一定不存在或者kennel存在”。

相比于传统的map、set等数据结构,占用空间更少,但其返回结果是概率型的,不确定。

布隆过滤器内部维护一个bitArray(位数组),开始所有数据为0,当一个元素过来时,能过多个哈希函数(hash1、hash2、hash3)计算不同的hash值,并通过hash值找到bitArray的下标,将里面的值改为由0变为1。布隆过滤器有一个误判率,误判率越低,数组越长,所在空间越大,误判率越高,数组越小,所占空间越小。

这里贴上一个技术大牛的博客地址,里面对布隆过滤器用法以及在redis里面处理缓存穿透问题的详细介绍。

https://www.cnblogs.com/yscl/p/12003359.html

1、数组是多个 相同类型 的数据的组合,一个数组一旦声明/定义了,其 长度是固定的,不能动态变化 。

2、var arr []int    这时arr就是一个slice 切片 。

3、数组中的元素可以是任何数据类型,包括值类型和引用类型,但是 不能混用 。

4、数组创建后,如果没有赋值,有默认值如下:

        数值类型数组:    默认值为 0

        字符串数组:       默认值为 ""

        bool数组:           默认值为 false

5、使用数组的步骤:

        (1)声明数组并开辟空间

        (3)给数组各个元素赋值

        (3)使用数组

6、数组的下标是从0开始的。

7、数组下标必须在指定范围内使用,否则报panic:数组越界,比如var arr [5]int的有效下标为0~4.

8、Go的数组属于 值类型 ,在默认情况下是 值传递 ,因此会进行值拷贝。 数组间不会相互影响。

9、如想在其他函数中去修改原来的数组,可以使用 引用传递 (指针方式)。

10、长度是数组类型的一部分,在传递函数参数时,需要考虑数组的长度,看以下案例:

题1:编译错误,因为不能把[3]int类型传递给[]int类型,前者是数组,后者是切片;

题2:编译错误,因为不能把[3]int类型传递给[4]int类型;

题3:编译正确,因为[3]int类型传给[3]int类型合法。