package config import ( "math" "regexp" ) func anyRegexMatch(f string, res []*regexp.Regexp) bool { for _, re := range res { if regexMatched(f, re) { return true } } return false } func regexMatched(f string, re *regexp.Regexp) bool { if re == nil { return false } if re.FindString(f) != "" { return true } return false } func containsDigit(s string) bool { for _, c := range s { switch c { case '1', '2', '3', '4', '5', '6', '7', '8', '9': return true } } return false } // shannonEntropy calculates the entropy of data using the formula defined here: // https://en.wiktionary.org/wiki/Shannon_entropy // Another way to think about what this is doing is calculating the number of bits // needed to on average encode the data. So, the higher the entropy, the more random the data, the // more bits needed to encode that data. func shannonEntropy(data string) (entropy float64) { if data == "" { return 0 } charCounts := make(map[rune]int) for _, char := range data { charCounts[char]++ } invLength := 1.0 / float64(len(data)) for _, count := range charCounts { freq := float64(count) * invLength entropy -= freq * math.Log2(freq) } return entropy }