Sembra che ci siano molti "tipi" di entropia. Ho trovato due concetti diversi:
A) L'esempio XKCD di correcthorsebatterystaple
. Ha 44 bit di entropia perché quattro parole scelte a caso da un elenco di 2048 parole sono 4 * log2 (2048) = 44 bit di entropia. Questo capisco.
B) L'entropia di Shannon della stringa attuale, vale a dire che l'entropia viene calcolata in base alle frequenze delle lettere / simboli. Applicando la formula di Shannon su correcthorsebatterystaple
il risultato è 3,36 bit di entropia per carattere.
# from http://stackoverflow.com/a/2979208
import math
def entropy(string):
"Calculates the Shannon entropy of a string"
# get probability of chars in string
prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
print entropy('correcthorsebatterystaple')
# => 3.36385618977
Wikipedia aggiunge solo confusione:
It is important to realize the difference between the entropy of a set of possible outcomes, and the entropy of a particular outcome. A single toss of a fair coin has an entropy of one bit, but a particular result (e.g. "heads") has zero entropy, since it is entirely "predictable".
-- Wikipedia: Entropy (information theory)
Non capisco perfettamente la distinzione tra l'entropia del lancio (generazione) e l'entropia del risultato (la stringa).
- Quando viene utilizzato B e per quale scopo?
- Quale concetto riflette con precisione l'entropia della password?
- Esiste una terminologia per distinguere tra i due?
- La vera casualità potrebbe darci
correctcorrectcorrectcorrect
. utilizzando A abbiamo ancora 44 bit. Usando B l'entropia sarebbe la stessa di quello dicorrect
. Quando è la differenza tra i due importanti? - Se un requisito specifica che una stringa deve avere 20 bit di entropy-do io uso A o B per determinare l'entropia?