go-domain-suffix-trie 域名后缀树(Golang) go-domain-suffix-trie

CC11001100 • 1565 次点击    
这是一个分享于 的项目,其中的信息可能已经有所发展或是发生改变。
项目地址:https://github.com/golang-infrastructure/go-domain-suffix-trie # 域名后缀树(Golang) ## 一、什么是域名后缀树 类似于字典后缀树,不同的是域名后缀树是以.切分域名的各个部分, 对域名中的每个部分作为一个Node建立后缀树以便高效进行后缀匹配查询。 比如: ```text www.google.com ``` 会以.分割域名为三个部分,每个部分建立一个节点: ![](https://github.com/golang-infrastructure/go-domain-suffix-trie/raw/main/.README_images/5f9cf648.png) 再增加一个: ```text baidu.com ``` 此时后缀树是这样子的: ![](https://github.com/golang-infrastructure/go-domain-suffix-trie/raw/main/.README_images/b7910457.png) ## 二、业务场景举例 比如现在有n个域名后缀,称之为集合A: ```text google.com api.baidu.com 007.qq.com ``` 然后有m个域名,称之为集合B: ```text a.google.com b.google.com c.google.com google.com google3.com a.api.baidu.com b.api.baidu.com 003.qq.com a.007.qq.com ``` 现在要为这集合B中的每个域名从集合A中做后缀匹配,这个工具类就是用来解决这个问题的,尤其是在海量子域名关联到根域名上时效率极高。 ## 三、Example 添加此项目作为依赖: ```text go get -u github.com/golang-infrastructure/go-domain-suffix-trie ``` 代码示例(DomainSuffixTree是线程安全的): ```go package main import ( "fmt" domain_suffix_trie "github.com/golang-infrastructure/go-domain-suffix-trie" ) func main() { // 调用 #NewDomainSuffixTrie 创建一颗后缀树 tree := domain_suffix_trie.NewDomainSuffixTrie[string]() // 将需要匹配的域名后缀依次调用 #AddDomainSuffix 添加到树上,添加的时候可以为后缀指定一个payload(使用集合A构建树) _ = tree.AddDomainSuffix("google.com", "谷歌主站子域名") _ = tree.AddDomainSuffix("map.google.com", "谷歌地图子域名") _ = tree.AddDomainSuffix("baidu.com", "百度主站子域名") _ = tree.AddDomainSuffix("jd.com", "京东子域名") // 需要查询的时候调用 #FindMatchDomainSuffixPayload 或者 #FindMatchDomainSuffixNode 查询, // 参数是一个完整的域名,会返回此域名匹配到的后缀在之前指定的payload(将集合B的每个元素依次在树上查询) fmt.Println(tree.FindMatchDomainSuffixPayload("test.google.com")) // output: 谷歌主站子域名 fmt.Println(tree.FindMatchDomainSuffixPayload("test.map.google.com")) // output: 谷歌地图子域名 fmt.Println(tree.FindMatchDomainSuffixNode("test.baidu.com").GetNodeTriePath()) // output: baidu.com fmt.Println(tree.FindMatchDomainSuffixNode("test.jd.com").GetNodeTrieValue()) // output: jd } ```
授权协议:
开发语言:
Golang 查看源码»
1565 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传