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)) }