➕ Added password validator
This commit is contained in:
+47
@@ -0,0 +1,47 @@
|
||||
package passwordvalidator
|
||||
|
||||
import (
|
||||
"math"
|
||||
)
|
||||
|
||||
// GetEntropy returns the entropy in bits for the given password
|
||||
// See the ReadMe for more information
|
||||
func GetEntropy(password string) float64 {
|
||||
return getEntropy(password)
|
||||
}
|
||||
|
||||
func getEntropy(password string) float64 {
|
||||
base := getBase(password)
|
||||
length := getLength(password)
|
||||
|
||||
// calculate log2(base^length)
|
||||
return logPow(float64(base), length, 2)
|
||||
}
|
||||
|
||||
func logX(base, n float64) float64 {
|
||||
if base == 0 {
|
||||
return 0
|
||||
}
|
||||
// change of base formulae
|
||||
return math.Log2(n) / math.Log2(base)
|
||||
}
|
||||
|
||||
func logBaseTo2(base, n float64) float64 {
|
||||
if base == 0 {
|
||||
return 0
|
||||
}
|
||||
// change of base formulae
|
||||
return math.Log2(n) / math.Log2(base)
|
||||
}
|
||||
|
||||
// logPow calculates log_base(x^y)
|
||||
// without leaving logspace for each multiplication step
|
||||
// this makes it take less space in memory
|
||||
func logPow(expBase float64, pow int, logBase float64) float64 {
|
||||
// logb (MN) = logb M + logb N
|
||||
total := 0.0
|
||||
for i := 0; i < pow; i++ {
|
||||
total += logX(logBase, expBase)
|
||||
}
|
||||
return total
|
||||
}
|
||||
Reference in New Issue
Block a user