Python 计算字符串复杂性

Python 计算字符串复杂性,python,string,algorithm,statistics,passwords,Python,String,Algorithm,Statistics,Passwords,我的最终目标是计算定义给定输入字符串复杂性的单个度量 这里有一些例子,我将考虑更多复杂字符串: jkgf82bclov193ng5783jcjus763hesv9w 389i2vc9wmv02sdcpe34asci3 m32i8s93 ab uuuuuuuu aaaaa11111 a1a1a1a1a1 这里有一些例子,我认为<< /强>复杂字符串: jkgf82bclov193ng5783jcjus763hesv9w 389i2vc9wmv02sdcpe34asci3 m32i8s

我的最终目标是计算定义给定输入字符串复杂性的单个度量

这里有一些例子,我将考虑<强>更多<强>复杂字符串:

jkgf82bclov193ng5783jcjus763hesv9w 
389i2vc9wmv02sdcpe34asci3
m32i8s93
ab  
uuuuuuuu
aaaaa11111
a1a1a1a1a1 

这里有一些例子,我认为<强><< /强>复杂字符串:

jkgf82bclov193ng5783jcjus763hesv9w 
389i2vc9wmv02sdcpe34asci3
m32i8s93
ab  
uuuuuuuu
aaaaa11111
a1a1a1a1a1 
是否有人知道任何已知的算法/度量/系数可用于将输入字符串的复杂性汇总为一个数字,并在0和1之间进行标准化?也许这是确定密码输入复杂性的常见问题

我的方法

我相信还有比这更好的办法

给定一个输入字符串
s
,我采用的简单方法是使用
len(set)(s))
所使用的唯一字符数,找到可以编码成该长度
len(s)
字符串的最大信息量

i、 e.对于字符串abb,长度为3,唯一字符数为2。因此,我的复杂性度量是3^2=9。如果我定义一个上限,那么我可以将0和1之间的字符串标准化。如果上界为20,则9/20为复杂性分数。如果上界为5,则复杂性分数为1

lst = ["000Gg129", "0000aaaa", "a894iunck", "4iu3nclqkerav8e4", "777777777777bbbbbbbbbbb", "36sne8zk"]
upper_bound = 4000000

for s in lst:
    unique_chars = set(s)
    complexity = (len(s) ** len(unique_chars)) / upper_bound
    normalized_complexity = 1 if complexity>1 else complexity
    print(s, normalized_complexity)

输出

1            jkgf82bclov193ng5783jcjus763hesv9w
1            389i2vc9wmv02sdcpe34asci3
0.524288     m32i8s93
2e-06        uuuuuuuu
2.5e-05      aaaaa11111
2.5e-05      a1a1a1a1a1

强制性…@Edeki,对于您的度量,输入的
ab
将给出1.0的答案,但是
ab
非常重要simple@Jon,xkcd总是受欢迎的(尽管我不会使用此指标来验证密码)。也。最后:除非你有安全方面的背景,否则把安全问题留给专家们。不要自己滚。相反,要依靠那些知道自己在做什么的人所做的工作。强制性的…@Edeki,对于你的度量,输入
ab
会给出1.0的答案,但是
ab
非常重要simple@Jon,xkcd总是受欢迎的(尽管我不会使用此指标来验证密码)。也。最后:除非你有安全方面的背景,否则把安全问题留给专家们。不要自己滚。相反,依靠那些知道自己在做什么的人所做的工作。