mirror of
https://github.com/v2fly/v2ray-core.git
synced 2026-04-12 00:35:27 -04:00
improve performance of domain matcher
This commit is contained in:
52
common/strmatcher/domain_matcher.go
Normal file
52
common/strmatcher/domain_matcher.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package strmatcher
|
||||
|
||||
import "strings"
|
||||
|
||||
func breakDomain(domain string) []string {
|
||||
return strings.Split(domain, ".")
|
||||
}
|
||||
|
||||
type node struct {
|
||||
value uint32
|
||||
sub map[string]*node
|
||||
}
|
||||
|
||||
type DomainMatcherGroup struct {
|
||||
root *node
|
||||
}
|
||||
|
||||
func (g *DomainMatcherGroup) Add(domain string, value uint32) {
|
||||
if g.root == nil {
|
||||
g.root = &node{
|
||||
sub: make(map[string]*node),
|
||||
}
|
||||
}
|
||||
|
||||
current := g.root
|
||||
parts := breakDomain(domain)
|
||||
for i := len(parts) - 1; i >= 0; i-- {
|
||||
part := parts[i]
|
||||
next := current.sub[part]
|
||||
if next == nil {
|
||||
next = &node{sub: make(map[string]*node)}
|
||||
current.sub[part] = next
|
||||
}
|
||||
current = next
|
||||
}
|
||||
|
||||
current.value = value
|
||||
}
|
||||
|
||||
func (g *DomainMatcherGroup) Match(domain string) uint32 {
|
||||
current := g.root
|
||||
parts := breakDomain(domain)
|
||||
for i := len(parts) - 1; i >= 0; i-- {
|
||||
part := parts[i]
|
||||
next := current.sub[part]
|
||||
if next == nil {
|
||||
break
|
||||
}
|
||||
current = next
|
||||
}
|
||||
return current.value
|
||||
}
|
||||
Reference in New Issue
Block a user