以下是用于生成密码的代码段, 我对此有2个问题,请您分享如何理解?
arr.length / 2
,来自urandom的帮助,返回了n个适合密码使用的随机字节,也就是说,它将返回6个字节,是否是ASCII的6个?
urandom(6)
,获取上述字节的十进制基数,为什么这里要转换为十进制基数?
ord(c)
的帮助:
urandom
Python脚本:
def urandom(n): # real signature unknown; restored from __doc__
"""
urandom(n) -> str
Return n random bytes suitable for cryptographic use.
"""
return ""
答案 0 :(得分:5)
urandom
将返回一个字节(即0到255之间的值)。示例代码使用该值和模运算符(%
)将其转换为0到22之间的值,以便它可以返回23个字母之一(I
,O
和Q
排除在外,以免与数字混淆。
请注意,这不是一个完美的平衡算法,因为它更喜欢前三个字母(A
,B
和C
),因为256不能被23和256 % 23
是3
。
答案 1 :(得分:1)
ord()
函数接收包含单个字符的字符串,并返回其Unicode索引。
例如
ord("A") => 65
ord("£") => 163
它不是用来获取您提到的字节的十进制基数,而是用来获取其Unicode索引(在Unicode表中的位置)。
P.S。 :-即使返回Unicode索引,但这并不意味着它会返回range = len(Unicode Table),原因是您的python编译器在正常情况下可能不支持这么长的字符集。