似乎有许多不同的“种类”熵。我遇到了两个不同的概念:
A) 的 XKCD 示例correcthorsebatterystaple
。它有 44 位熵,因为从 2048 个单词列表中随机选择的四个单词是 4 * log2(2048) = 44 位熵。这个我明白。
B) 实际字符串的香农熵,即熵是根据字母/符号的频率计算的。对结果应用香农公式correcthorsebatterystaple
是每个字符 3.36 位熵。
# 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
维基百科只会增加我的困惑:
重要的是要认识到一组可能结果的熵与特定结果的熵之间的差异。一次抛硬币的熵只有一位,但特定结果(例如“正面”)的熵为零,因为它是完全“可预测的”。
--维基百科:熵(信息论)
我不太明白折腾的熵(生成)和结果的熵(字符串)之间的区别。
- 什么时候使用 B 以及用于什么目的?
- 哪个概念准确地反映了密码的熵?
- 是否有术语可以区分两者?
- 真正的随机性可以给我们
correctcorrectcorrectcorrect
。使用 A 我们仍然有 44 位。使用 B 的熵将与 的熵相同correct
。两者之间的区别何时重要? - 如果一个要求指定一个字符串需要有 20 位的熵——我是使用 A 还是 B 来确定熵?