パスワードの強度

パスワードの強度 - rubyco(るびこ)の日記より。Haskellで実装してみました。あれ、Integerの累乗を求める関数って標準で用意されていませんでしたっけ?

module Main (main) where

import Data.List (genericLength)

power :: Integer -> Integer -> Integer
power _ 0 = 1
power m n = m * power m (n - 1)

passwordStrengthByBits :: [a] -> Integer -> Double
passwordStrengthByBits xs =
  logBase 2 . fromInteger . power (genericLength xs)

lower, upper, digit, alpha, alnum :: [Char]
lower = ['a' .. 'z']
upper = ['A' .. 'Z']
digit = ['0' .. '9']
alpha = lower ++ upper
alnum = alpha ++ digit

main :: IO ()
main = do
  print $ passwordStrengthByBits lower 8 -- => 37.60351774512874
  print $ passwordStrengthByBits alpha 8 -- => 45.60351774512874
  print $ passwordStrengthByBits alnum 8 -- => 47.633570483095006