【数据结构】BitMap

首先,根据order_id建立与其他列的映射关系,order_id其实就是 BitMap,如图:

如果按商家统计今日接单量:

如果按顾客或者送货地址统计接单量,也是类似,这里查询统计接单量是非常实用的。

此外,快速查找一个数据是否在订单集合里也很简单,这里 order_id 的 0~5 中 1~5 对应的位均会被修改为1,如果查找订单0是否存在,判断0对应的位是否为1即可,很明显不存在订单0。而去重的话,BitMap结构决定它具有去重的特性,如果有两个订单3,第一个订单3会将3对应的位修改为1,第二个也会修改为1,最终3对应的位仍然是1。BitMap结构也决定它具有排序特性,这个很好理解。

2、取两个集合的交集,并集等

接着上面的查询统计,如果查询十足便利店被高新区下单的情况,该如何查询呢?这里,就相当于取 十足便利店 和 高新区 的交集了,如图所示:

那如果改为查询 十足便利店 或 高新区下单的情况,该如何查询呢?这里,就相当于取 十足便利店 和 高新区 的并集了,如图所示:

三、BitMap的实现

1、自己动手实现BitMap

代码简单实现如下:

public class BitMap {
    private char[] bytes; // 用字符数组存储元素
    private int nBits; // 指定BitMap长度

    public BitMap(int nBits) {
        this.nBits = nBits;
        this.bytes = new char[nBits / 16 + 1]; // 一个字符占2个字节,也就是2*8=16bit
    }

    /**
     * 设置int整数对应的位,修改为1
     */
    public void set(int k) {
        if (k > nBits)
            return;
        int byteIndex = k / 16;
        int bitIndex = k % 16;
        bytes[byteIndex] |= (1 << bitIndex);
    }

    /**
     * 获取int整数对应的位是否存在,true存在,false不存在
     */
    public boolean get(int k) {
        if (k > nBits)
            return false;
        int byteIndex = k / 16;
        int bitIndex = k % 16;
        return (bytes[byteIndex] & (1 << bitIndex)) != 0;
    }
}

测试一下:

@SpringBootTest
class MySportHealthyApplicationTests {
    @Test
    void test1() {
        int[] arr = new int[]{6, 2, 7, 14, 3};
        int maxArr = Arrays.stream(arr).max().getAsInt();
        // 指定BitMap长度
        BitMap bitMap = new BitMap(maxArr + 1);
        // 数组的整数放进BitMap
        for (int i = 0; i < arr.length; i++) {
            bitMap.set(arr[i]);
        }
        // 判断哪些值存在
        for (int i = 0; i < maxArr + 1; i++) {
            logger.info(i + ",是否在BitMap内-----》:" + bitMap.get(i));
        }
    }
}

控制台输出结果:

注意:

实际上海量数据的设置和查询逻辑没有这么简单,甚至会出现一些极端情况,比如有一个整型数组[1,2,50000,80000000000],元素间隔很大,导致2和50000,以及50000和80000000000之间存在很多空的bit,这些bit很明显占据了很大的空间,我们可以参考JDK中位集的概念,引入 word 有效解决了这类问题,感兴趣的可以去阅读 BitSet 集合源码一探究竟。

2、JDK中实现的BitMap —— BitSet 集合

下面这段是JDK对BitSet集合的描述:

This class implements a vector of bits that grows as needed. Each component of the bit set has a boolean value. The bits of a BitSet are indexed by nonnegative integers. Individual indexed bits can be examined, set, or cleared. One BitSet may be used to modify the contents of another BitSet through logical AND, logical inclusive OR, and logical exclusive OR operations.
By default, all bits in the set initially have the value false.
Every bit set has a current size, which is the number of bits of space currently in use by the bit set. Note that the size is related to the implementation of a bit set, so it may change with implementation. The length of a bit set relates to logical length of a bit set and is defined independently of implementation.
Unless otherwise noted, passing a null parameter to any of the methods in a BitSet will result in a NullPointerException.
A BitSet is not safe for multithreaded use without external synchronization.

总结如下:

  • 一个BitSet对象可以通过logical AND、logical inclusive OR、AND logical exclusive OR操作来修改另一个BitSet对象的内容;
  • 默认情况下,集合中的所有位的初始值为false。位集的每个组成部分都有一个布尔值,每个位集都有一个当前大小,即该位集当前使用的空间位数,换言之大小与位集的实现有关,因此它可能随实现而改变;
  • BitSet集合对于多线程使用是不安全的。
  • 另外,BitSet 可以看作是 word 组成的数组,而一个word 对应一个64位的long类型,需要6个地址位。

做下测试:

@SpringBootTest
class MySportHealthyApplicationTests {
    @Test
    void test1() {
        int[] arr = new int[]{1, 7, 50000, 30000000}; //1到3千万
        int maxArr = Arrays.stream(arr).max().getAsInt();
        BitSet bitSet = new BitSet(maxArr + 1);
        // 存放数据
        bitSet.set(1);
        bitSet.set(7);
        bitSet.set(50000);
        bitSet.set(30000000);
        // 查找
        logger.info("1000是否存在------->" + bitSet.get(1000)); //false
        logger.info("7是否存在------->" + bitSet.get(7)); //true
        logger.info("50000是否存在------->" + bitSet.get(50000)); //true
        logger.info("5000000是否存在------->" + bitSet.get(5000000)); //false
        logger.info("30000000是否存在------->" + bitSet.get(30000000)); //true
    }
}

3、谷歌实现的BitMap —— EWAHCompressedBitmap

对于一个很长的 BitMap 只存储少量的数据,比如只有第50000000的位置为1,那么它之前的空间会造成浪费,所以谷歌的实现对这个空间进行了优化,提供了 EWAHCompressedBitmap ,要使用需要先引入依赖:

<!--EWAHCompressedBitmap-->
<dependency>
    <groupId>com.googlecode.javaewah</groupId>
    <artifactId>JavaEWAH</artifactId>
    <version>1.1.0</version>
</dependency>

原理:

EWAHCompressedBitmap 将整个的二进制数据划分为一个个Word,一个Word需要64位 ,而一个空的 BitMap 默认拥有 4 个word ,也就是 4*64=256 位,其中 word0 存储 BitMap 的头信息,当我们改变对应位置的bit位的值时 word 会跟着变化。

Word又可以分为两种:直接存储数据的LW,存储跨度信息的RLW,EWAH有些Word存储实际数据,有些Word存储数据和数据之间的间隔个数,当节点之间跨度很大时,Bitmap不会傻傻把长度扩充到Bitmap的最高位那么多,他会由一个节点专门存储两个节点之间的跨度信息,以此达到节省空间的目的。在插入新的数据的时候,如果数据不存放在已有的Word当中,EWAH还会进行动态扩充或对存储跨度的节点进行分裂。

结构和原理可以参考:https://www.it610.com/article/1283246062009597952.htm

四、BitMap总结

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

如何自学黑客&网络安全

黑客零基础入门学习路线&规划

初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.

如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
img

网络安全工程师企业级学习路线

img
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的

视频配套资料&国内外网安书籍、文档&工具

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

img
一些笔者自己买的、其他平台白嫖不到的视频教程。
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

t,png)
一些笔者自己买的、其他平台白嫖不到的视频教程。
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Xx3N5ESp-1712879598243)]

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值