Golang Go语言中的域名后缀树

发布于 1周前 作者 htzhanglong 来自 Go语言

项目地址: https://github.com/golang-infrastructure/go-domain-suffix-trie

域名后缀树( Golang )

一、什么是域名后缀树

类似于字典后缀树,不同的是域名后缀树是以.切分域名的各个部分, 对域名中的每个部分作为一个 Node 建立后缀树以便高效进行后缀匹配查询。

比如:

www.google.com

会以.分割域名为三个部分,每个部分建立一个节点:

再增加一个:

baidu.com

此时后缀树是这样子的:

二、业务场景举例

比如现在有 n 个域名后缀,称之为集合 A:

google.com
api.baidu.com
007.qq.com

然后有 m 个域名,称之为集合 B:

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

添加此项目作为依赖:

go get -u github.com/golang-infrastructure/go-domain-suffix-trie

代码示例( DomainSuffixTree 是线程安全的):

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 Go语言中的域名后缀树

更多关于Golang Go语言中的域名后缀树的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

这个函数名的长度和 java 有的一拼

更多关于Golang Go语言中的域名后缀树的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


和路由前缀树差不多,Reverse 一下就好了

你这个树性能比正则好吗?

好家伙 函数名和 java 一个味道了

哈哈哈,库名字就长点就长点,不过我也一直在头痛限于文化水平取不出言简意赅的方法名啥的…

是的,大佬牛皮

具体看场景,这个是我从老久之前做过的一个项目里抠出来的,那个场景是短时间内有大量的查询,引入这个后缀树优化之后速度比原来提升了八十多倍好像

跟这个 PAC 脚本异曲同工😁
https://github.com/ifyour/ipac

哈哈哈看上去是有点像,不过那个库好像是用正则实现的,看场景吧,这个库的定位是底层支撑库,上层各种应用的功能可以基于多个这种库组合而来,想搞搞 infra…

在Golang(Go语言)中,域名后缀树(也称为Trie树或前缀树)是一种高效的数据结构,常用于处理字符串集合,特别是那些需要频繁进行前缀匹配、插入和删除操作的场景。域名后缀树通过节点表示字符,并利用边来存储从根节点到某个叶节点路径上的字符串,从而实现了对字符串集合的紧凑存储和快速检索。

在Go语言中实现域名后缀树时,可以定义一个结构体来表示Trie树的节点,每个节点包含一个字符和指向其子节点的映射(通常使用map实现)。插入操作涉及从根节点开始,根据字符序列逐步向下创建或遍历节点,直到插入完整的字符串。查找操作则类似,通过逐字符匹配来遍历Trie树,直到找到目标字符串或确定不存在。

域名后缀树在DNS解析、URL路由匹配、自动补全等场景中有着广泛的应用。由于其高效的前缀匹配能力,它能够在大量字符串中快速定位到符合条件的项,从而显著提高处理效率。

需要注意的是,虽然域名后缀树在处理字符串集合时具有显著优势,但其空间复杂度可能较高,特别是在字符串集合较大且字符串较长时。因此,在实际应用中需要根据具体需求和数据特点来选择合适的数据结构。

总之,Golang中的域名后缀树是一种强大的字符串处理工具,通过合理的实现和优化,可以在各种应用场景中发挥重要作用。

回到顶部