上一节我们讲了,布隆过滤器最大的特点就是比较省存储空间,所以,用它来解决这个问题再合适不过了。如果我们要存储 500 万个手机号码,我们把位图大小设置为 10 倍数据大小,也就是 5000 万,那也只需要使用 5000 万个二进制位(5000 万 bits),换算成字节,也就是不到 7MB 的存储空间。比起散列表的解决方案,内存的消耗减少了很多。
这段话中:对于需要使用的内存空间有疑问,按照上一节的处理方式,把手机号码转换为整数,使用的内存空间应该是整数的范围 * 10 bits, 而不是手机号的数量 * 10 bits? 或者,这里不把手机号码转化为整数,用其他的哈希方法,把这500w个手机号映射到[0, 500W)这个区间内?
作者回复: 布隆过滤器本身就是解决位图消耗空间比较多的问题。位图的大小是数据的范围。而布隆过滤器的大小应该是小于位图大小的,所以肯定就是数据的范围了。