所有完整实现代码:match
CIDR
我们知道cidr对ip匹配时,只要cidr的mask长度的前几位与要匹配的ip相同,则可以说匹配成功.
1 | 假设有一个cidr为128.0.0.1/24 |
域名
域名就比较简单了,直接按点分割就行了
前缀树
通过上述规则 我们可以使用前缀树实现CIDR对ip的匹配
1 | root |
域名的前缀树相同,只不过域名不再是只有0和1,而且在匹配的时候还需要跳过前面的那些前缀.
1 | +---------+ |
trie树类似上述结构
trie树节点 我们可以这样写
+node
|- bool(判断是否匹配成功,是否是某一cidr的末尾)
|- left(左树代表0)
|- right(右树代表1)
域名的这样写
+node
|- bool
|- domainNode
|- next
使用golang实现
1 | type node struct { |
对每一个CIDR的插入
注意: 此处传入的CIDR为CIDR前mask位的二进制形式
1 | func (trie *TrieTree) Insert(str string) { |
对ip的匹配
注意: 此处传入的ip为ip的二进制形式
1 | func (trie *TrieTree) Search(str string) bool { |