pybloom_live的简单使用

一、windows安装:

这个参考我另一个博客吧,省的绕弯路,我都因为这个耽误很多时间。
window下安装pybloom_live

二、pybloom_live的简单使用:

pybloom_live下面有俩个方法,BloomFilter(定容)和ScalableBloomFilter(可伸缩的)。
bloom是根据一个位进行投影的去重算法,具体我没有了解这么深,如果感兴趣,自己谷歌或者百度搜索了解吧。

1、定容BloomFilter的用法:

from pybloom_live import BloomFilter

bf = BloomFilter(capacity=1000)

bf.add("皮卡丘1")

print("皮卡丘1" in bf)   # True
print("皮卡丘2" in bf)  # False

其中:
capacity是必须的参数,
进入方法说明,查看:
capacity意思就是做多可以加入这么多数,如果再插入就会增加错误率,但是我 好奇测试了,结果报错了。

error_rate:错误率(选填)
在这里插入图片描述

测试能否超过定容数量:

from pybloom_live import BloomFilter

f = BloomFilter(capacity=1000, error_rate=0.001)
print(f.capacity)
# 1000
print('len(f):', len(f))
for i in range(0, f.capacity):
    f.add(i)
    print("加入成功",i)
for i in range(0, f.capacity):
    f.add(i + 999)
    print("加入成功",i,len(f))

print('len(f):', len(f))

报错:

在这里插入图片描述

可以看出,数量是固定的,不能过多的加入。定容1000时,1001可以加入,到1002时就报错了。

2、ScalableBloomFilter(可伸缩)

这个就是如果超过初始数量,也是可以的,但是错误率会增加一点,但是不会报错。所以实际是还是使用可伸缩比较好,具体还是看看需求吧,如果数量去重的不多,定容的也很好。

from pybloom_live import ScalableBloomFilter

#mode=ScalableBloomFilter.SMALL_SET_GROWTH
sbf = ScalableBloomFilter(initial_capacity=100, error_rate=0.001, mode=ScalableBloomFilter.LARGE_SET_GROWTH)

url = "皮卡丘1"
url2 = "皮卡丘2"

sbf.add(url)

print(url in sbf)   # True
print(url2 in sbf)  # False

官方参数:
initial_capacity:这个初始化默认容量100,其实加入1000,也能用。错误率和mode都有默认。
在这里插入图片描述

3、对比定容不一样,加入的一样的ScalableBloomFilter(LARGE_SET_GROWTH)

(mode=ScalableBloomFilter.LARGE_SET_GROWTH)

我这里以分别定容为100,1000,10000,加入都是1000,测试总共加入完毕用时,和加入成功的数量为对比依据。

代码:

# mode=LARGE_SET_GROWTH
# 1、定容100,加入10000
from pybloom_live import ScalableBloomFilter
import time
# sbf = ScalableBloomFilter(initial_capacity=100, mode=ScalableBloomFilter.SMALL_SET_GROWTH)
sbf = ScalableBloomFilter(initial_capacity=100, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
count = 10000
start_time = time.time()
for i in range(0, count):
    sbf.add(i)
    # print("加入成功", i, len(sbf))
end_time = time.time()
print('定容100,加入10000')
print("时间", end_time-start_time)
print("成功加入长度", len(sbf))


# 2、定容1000,加入10000
from pybloom_live import ScalableBloomFilter
import time
# sbf = ScalableBloomFilter(initial_capacity=1000, mode=ScalableBloomFilter.SMALL_SET_GROWTH)
sbf = ScalableBloomFilter(initial_capacity=1000, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
count = 10000
start_time = time.time()
for i in range(0, count):
    sbf.add(i)
    # print("加入成功", i, len(sbf))
end_time = time.time()
print('定容1000,加入10000')
print("时间", end_time-start_time)
print("成功加入长度", len(sbf))
# print((1.0 - (len(sbf) / float(count))) <= sbf.error_rate + 2e-18)#True


# 3、定容10000,加入10000
from pybloom_live import ScalableBloomFilter
import time
# sbf = ScalableBloomFilter(initial_capacity=10000, mode=ScalableBloomFilter.SMALL_SET_GROWTH)
sbf = ScalableBloomFilter(initial_capacity=10000, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
count = 10000
start_time = time.time()
for i in range(0, count):
    sbf.add(i)
    # print("加入成功", i, len(sbf))
end_time = time.time()
print('定容10000,加入10000')
print("时间", end_time-start_time)
print("成功加入长度", len(sbf))
# print((1.0 - (len(sbf) / float(count))) <= sbf.error_rate + 2e-18)#True

输出结果:


定容100,加入10000
时间 0.1988668441772461
成功加入长度 9982
定容1000,加入10000
时间 0.15590405464172363
成功加入长度 9986
定容10000,加入10000
时间 0.1089334487915039
成功加入长度 9999

小总结(mode=ScalableBloomFilter.LARGE_SET_GROWTH):
通过输出的对比结果来看,选取的定容数量越是接近或者大于等于需要加入的去重数量,使用的时间越短,正确率越高。

4、对比定容不一样,加入的一样的ScalableBloomFilter(SMALL_SET_GROWTH)

(mode=ScalableBloomFilter.SMALL_SET_GROWTH)

代码:

# SMALL_SET_GROWTH
# 1、定容100,加入10000
from pybloom_live import ScalableBloomFilter
import time
sbf = ScalableBloomFilter(initial_capacity=100, mode=ScalableBloomFilter.SMALL_SET_GROWTH)
# sbf = ScalableBloomFilter(initial_capacity=100, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
count = 10000
start_time = time.time()
for i in range(0, count):
    sbf.add(i)
    # print("加入成功", i, len(sbf))
end_time = time.time()
print('定容100,加入10000')
print("时间", end_time-start_time)
print("成功加入长度", len(sbf))


# 2、定容1000,加入10000
from pybloom_live import ScalableBloomFilter
import time
sbf = ScalableBloomFilter(initial_capacity=1000, mode=ScalableBloomFilter.SMALL_SET_GROWTH)
# sbf = ScalableBloomFilter(initial_capacity=1000, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
count = 10000
start_time = time.time()
for i in range(0, count):
    sbf.add(i)
    # print("加入成功", i, len(sbf))
end_time = time.time()
print('定容1000,加入10000')
print("时间", end_time-start_time)
print("成功加入长度", len(sbf))
# print((1.0 - (len(sbf) / float(count))) <= sbf.error_rate + 2e-18)#True


# 3、定容10000,加入10000
from pybloom_live import ScalableBloomFilter
import time
sbf = ScalableBloomFilter(initial_capacity=10000, mode=ScalableBloomFilter.SMALL_SET_GROWTH)
# sbf = ScalableBloomFilter(initial_capacity=10000, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
count = 10000
start_time = time.time()
for i in range(0, count):
    sbf.add(i)
    # print("加入成功", i, len(sbf))
end_time = time.time()
print('定容10000,加入10000')
print("时间", end_time-start_time)
print("成功加入长度", len(sbf))
# print((1.0 - (len(sbf) / float(count))) <= sbf.error_rate + 2e-18)#True

结果:

定容100,加入10000
时间 0.2538635730743408
成功加入长度 9961
定容1000,加入10000
时间 0.1958630084991455
成功加入长度 9979
定容10000,加入10000
时间 0.1329190731048584
成功加入长度 9999

小总结:(mode=ScalableBloomFilter.SMALL_SET_GROWTH)
通过上面的结果对比来看,当定容数量和结果大于等于需要去重的个数时,去重效率越好,错误率越低(加入的正确率越高)

5、俩个mode对比:

通过上面3,4的来个结果对比,一下俩个mode的区别:

mode=ScalableBloomFilter.LARGE_SET_GROWTH的结果


定容100,加入10000
时间 0.1988668441772461
成功加入长度 9982
定容1000,加入10000
时间 0.15590405464172363
成功加入长度 9986
定容10000,加入10000
时间 0.1089334487915039
成功加入长度 9999

mode=ScalableBloomFilter.SMALL_SET_GROWTH的结果

定容100,加入10000
时间 0.2538635730743408
成功加入长度 9961
定容1000,加入10000
时间 0.1958630084991455
成功加入长度 9979
定容10000,加入10000
时间 0.1329190731048584
成功加入长度 9999

通过定容数量从小往大排序来看,当数量越接近加入的去重数量,效果幅度,SMALL_SET_GROWTH是最大的,而且SMALL_SET_GROWTH的用时和效率也比LARGE_SET_GROWTH的低,这也就反映出为什么默认是LARGE_SET_GROWTH。

6、总结测试:

通过上面的简单测试,发现使用ScalableBloomFilter(可伸缩)进入检查去重效果比较好,而且数量初始化参数尽量大于需求去重的数量效果最优,模式就使用默认的LARGE_SET_GROWTH最好。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: `pcap_open_live()` 函数是 libpcap 库中用于打开网络接口并开始捕获数据包的函数。它的原型如下: ```c pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf); ``` 其中,参数含义如下: - `device`:指定要打开的网络接口的名称,比如 `eth0` 或 `wlan0`。 - `snaplen`:指定捕获数据包的最大长度。如果数据包的长度超过了该值,则只会捕获前 `snaplen` 个字节的数据。 - `promisc`:指定是否开启混杂模式,即是否接收所有经过该网络接口的数据包,而不仅仅是目标地址为本机的数据包。 - `to_ms`:指定超时时间,单位为毫秒。如果在该时间内没有捕获到数据包,则 `pcap_next()` 函数会返回 NULL。 - `errbuf`:指定一个缓冲区,用于存储错误信息。如果函数执行失败,则会在该缓冲区中存储错误信息。 该函数返回一个 `pcap_t` 类型的指针,该指针可以传递给其他 libpcap 函数使用,比如 `pcap_compile()` 和 `pcap_loop()`。 以下是一个简单使用示例: ```c #include <pcap.h> #include <stdio.h> int main(int argc, char *argv[]) { char *device = "eth0"; int snaplen = 65535; int promisc = 1; int to_ms = 1000; char errbuf[PCAP_ERRBUF_SIZE]; // 打开网络接口 pcap_t *handle = pcap_open_live(device, snaplen, promisc, to_ms, errbuf); if (handle == NULL) { fprintf(stderr, "pcap_open_live() failed: %s\n", errbuf); return 1; } // 进行数据包捕获和处理 // ... // 关闭网络接口 pcap_close(handle); return 0; } ``` 在以上示例中,我们使用 `pcap_open_live()` 函数打开了一个名为 `eth0` 的网络接口,并设置了捕获数据包的最大长度为 65535,开启了混杂模式,设置了超时时间为 1000 毫秒。如果函数执行失败,则使用 `pcap_errbuf` 缓冲区存储错误信息。在接下来的代码中,可以使用 `handle` 指针进行数据包捕获和处理。最后,我们使用 `pcap_close()` 函数关闭网络接口。 ### 回答2: pcap_open_live是一个用于打开网络接口的函数,它是libpcap库中的一个函数。 使用pcap_open_live函数可以打开指定的网络接口,以便于后续的数据包捕获和分析。该函数的参数包括网络接口名称、捕获数据包的最大长度、是否设置为混杂模式、等待时间等。 其中,网络接口名称是一个字符串,指定要打开的网络接口的名称。可以使用pcap_findalldevs函数获取系统上所有可用的网络接口列表,并选择合适的接口名称。捕获数据包的最大长度是一个整数,表示每个数据包的最大字节数。可以根据实际需求设置合适的数值,一般建议设置为足够大的值。 是否设置混杂模式是一个布尔值,用于指定是否开启混杂模式。在混杂模式下,可以捕获网络上的所有数据包,而不仅仅是目的地址是本机的数据包。因此,如果需要对整个网络上的数据进行捕获和分析,可以将该参数设置为真。 等待时间是指在调用pcap_next或pcap_loop等函数时,如果没有数据包到达,允许等待的最长时间。可以根据实际需求设置合适的数值,较长的等待时间可以保证数据包的完整性,但也会增加程序的响应时间。 总之,pcap_open_live函数是一个用于打开网络接口的函数,使用它可以实现对特定网络接口上的数据包进行捕获和分析。 ### 回答3: pcap_open_live是一个用于打开网络接口的库函数,用于捕获网络数据包的函数。它是libpcap库的一部分,常用于网络数据包分析和网络安全领域。 pcap_open_live函数可以接受三个参数,分别是网络接口名称、最大捕获数据长度和是否开启混杂模式。网络接口名称可以是设备名称,如“eth0”或“en0”,也可以是特殊的字符串“any”,表示打开所有的网络接口。最大捕获数据长度表示捕获的数据包的最大长度,一般建议设置为65535字节,以确保捕获整个数据包。而混杂模式则是表示是否开启网络接口的混杂模式,即接收所有通过该接口的数据包,而不仅仅是目标地址是本机的数据包。 使用pcap_open_live函数,可以方便地打开网络接口,开始捕获数据包。在捕获数据包时,我们可以使用其他libpcap函数如pcap_next_ex函数来获取每个捕获的数据包。通过分析捕获的数据包,我们可以获得网络协议、源和目标IP地址、源和目标端口等网络信息,进而进行网络分析和安全检测。 总之,pcap_open_live函数是一个功能强大的函数,用于打开网络接口并捕获网络数据包。它在网络分析和网络安全领域有着广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhaojiafu666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值