77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package main
|
|
|
|
// 是否有符合要求的log
|
|
func calculateSimilaritys(n int, log1 string, logs ...string) bool {
|
|
for _, log := range logs {
|
|
similarity := calculateSimilarity(log1, log)
|
|
if similarity <= n {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 放回不相同数量
|
|
func calculateSimilarity(log1, log2 string) int {
|
|
l1 := parseErlangString(log1)
|
|
l2 := parseErlangString(log2)
|
|
s, l := calcSimilar(l1, l2)
|
|
return l - s
|
|
}
|
|
|
|
// 计算相似度
|
|
func calcSimilar(log1 []string, log2 []string) (int, int) {
|
|
//忽略
|
|
const ignore = 4
|
|
langer := max(len(log1), len(log2))
|
|
later := min(len(log1), len(log2))
|
|
sim := 0
|
|
for i := ignore; i < later; i++ {
|
|
if log1[i] == log2[i] {
|
|
sim++
|
|
} else if len(log1[i]) == len(log2[i]) {
|
|
var iSim = 0
|
|
for j := 0; j < len(log1[i]); j++ {
|
|
if log1[i][j] == log2[i][j] {
|
|
iSim++
|
|
}
|
|
}
|
|
if float64(iSim)/float64(len(log1[i])) > 0.95 {
|
|
sim++
|
|
}
|
|
}
|
|
}
|
|
return sim, langer - 4
|
|
}
|
|
|
|
func parseErlangString(logStr string) []string {
|
|
var (
|
|
head = 0
|
|
i []int32
|
|
r []string
|
|
)
|
|
for _, v := range logStr {
|
|
switch v {
|
|
case ' ':
|
|
case '{':
|
|
head++
|
|
if head != 1 {
|
|
i = append(i, v)
|
|
}
|
|
case '}':
|
|
if head != 1 {
|
|
i = append(i, v)
|
|
}
|
|
head--
|
|
default:
|
|
if v == ',' && len(i) != 0 && head == 1 {
|
|
r = append(r, string(i))
|
|
i = nil
|
|
} else {
|
|
i = append(i, v)
|
|
}
|
|
}
|
|
}
|
|
return append(r, string(i))
|
|
}
|