#ip #trie #networking #cidr

无 std ip_network_table-deps-treebitmap

快速 IPv4/IPv6 查找 trie 的分支版本

1 个不稳定版本

使用旧的 Rust 2015

0.5.0 2020 年 3 月 30 日

#1651网络编程

Download history 8080/week @ 2023-11-20 13284/week @ 2023-11-27 13649/week @ 2023-12-04 16960/week @ 2023-12-11 17338/week @ 2023-12-18 6466/week @ 2023-12-25 14825/week @ 2024-01-01 18360/week @ 2024-01-08 16667/week @ 2024-01-15 17244/week @ 2024-01-22 21937/week @ 2024-01-29 17453/week @ 2024-02-05 19522/week @ 2024-02-12 19985/week @ 2024-02-19 22440/week @ 2024-02-26 27844/week @ 2024-03-04

90,479 每月下载量
用于 22 个 crate(直接使用 8 个)

MIT 许可证

87KB
2K SLoC

Tree-Bitmap:IPv4/IPv6 前缀的快速查找表

源自 https://github.com/hroi/treebitmap

此 crate 提供了一种快速 IP 地址查找的数据结构。它旨在实现快速查找时间和合理的内存占用。

内部数据结构基于 W. Eatherton、Z. Dittia、G. Varghes 描述的 Tree-bitmap 算法。

文档

Rustdoc: https://docs.rs/ip_network_table-deps-treebitmap/

插图

一个示例插图,展示了一个表示包含 0.0.0.0/0 (foo),10.0.0.0/8 (bar),172.16.0.0/12 (baz) 和 192.168.0.0/16 (quux) 的路由表的 trie。

rfc1918 trie illustration

内部 trie 数据结构基础

Node 使用位图编码结果和子节点指针。

trie 节点在作为“结束节点”时可以编码最多 31 个结果,在作为正常/内部节点时可以编码 15 个结果和 16 个子树/子节点。

位图中每个位表示一个匹配模式

0 1 2 3 4 5 6 7
匹配 * 0* 1* 00* 01* 10* 11* 000*
8 9 10 11 12 13 14 15
匹配 001* 010* 011* 100* 101* 110* 111* 结束节点位

这里最后一个位不表示模式。它表示此节点是否是“结束节点”。结束节点携带双倍的结果数量,但不能编码任何子指针。

16 17 18 19 20 21 22 23
匹配 0000* 0001* 0010* 0011* 0100* 0101* 0110* 0111*
24 25 26 27 28 29 30 31
匹配 1000* 1001* 1010* 1011* 1100* 1101* 1110* 1111*

结果值的存储位置是通过将基指针 result_ptr 和其位集中的位置相加来计算的。

如果末端节点位没有被设置,最后16位编码了指向子节点的指针。如果位N被设置,则表示存在具有段值N的子节点。子节点指针的计算方法是将基指针 child_ptr 和其位集中的位置相加。

无运行时依赖