51 lines
891 B
Go
51 lines
891 B
Go
|
|
package bcap
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
"sync"
|
||
|
|
)
|
||
|
|
|
||
|
|
func fnvHash(key string) uint32 {
|
||
|
|
hash := uint32(2166136261)
|
||
|
|
for i := 0; i < len(key); i++ {
|
||
|
|
hash ^= uint32(key[i])
|
||
|
|
hash *= 16777619
|
||
|
|
}
|
||
|
|
return hash
|
||
|
|
}
|
||
|
|
|
||
|
|
var stringBuilderPool = sync.Pool{
|
||
|
|
New: func() interface{} {
|
||
|
|
return &strings.Builder{}
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
func getStringBuilder() *strings.Builder {
|
||
|
|
return stringBuilderPool.Get().(*strings.Builder)
|
||
|
|
}
|
||
|
|
|
||
|
|
func putStringBuilder(sb *strings.Builder) {
|
||
|
|
sb.Reset()
|
||
|
|
stringBuilderPool.Put(sb)
|
||
|
|
}
|
||
|
|
|
||
|
|
func buildKey(protocol, srcIP, srcPort, dstIP, dstPort string) string {
|
||
|
|
sb := getStringBuilder()
|
||
|
|
defer putStringBuilder(sb)
|
||
|
|
|
||
|
|
sb.WriteString(protocol)
|
||
|
|
sb.WriteString("://")
|
||
|
|
sb.WriteString(srcIP)
|
||
|
|
if srcPort != "" {
|
||
|
|
sb.WriteString(":")
|
||
|
|
sb.WriteString(srcPort)
|
||
|
|
}
|
||
|
|
sb.WriteString("=")
|
||
|
|
sb.WriteString(dstIP)
|
||
|
|
if dstPort != "" {
|
||
|
|
sb.WriteString(":")
|
||
|
|
sb.WriteString(dstPort)
|
||
|
|
}
|
||
|
|
return sb.String()
|
||
|
|
}
|