我想用python生成一些字母数字的密码。一些可能的方法包括:
import string
from random import sample, choice
chars = string.letters + string.digits
length = 8
''.join(sample(chars,length)) # way 1
''.join([choice(chars) for i in range(length)]) # way 2
但我两个都不喜欢,因为:
length 1仅选择了唯一字符,您不能生成密码,其中
i
变量,我找不到避免的好方法
那么,还有其他好的选择吗?
附注:这里我们使用timeit
进行了100000次迭代的测试:
''.join(sample(chars,length)) # way 1; 2.5 seconds
''.join([choice(chars) for i in range(length)]) # way 2; 1.8 seconds (optimizer helps?)
''.join(choice(chars) for _ in range(length)) # way 3; 1.8 seconds
''.join(choice(chars) for _ in xrange(length)) # way 4; 1.73 seconds
''.join(map(lambda x: random.choice(chars), range(length))) # way 5; 2.27 seconds
所以,获胜者是''.join(choice(chars) for _ in xrange(length))
。
发布于 2016-09-20 22:04:29
您应该使用secrets module来生成加密安全的密码,从Python3.6开始可以使用该密码。改编自文档:
import secrets
import string
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(20)) # for a 20-character password
有关食谱和最佳实践的更多信息,请参阅this section on recipes in the Python documentation。您还可以考虑添加string.punctuation
,甚至只对更广泛的字符集使用string.printable
。
发布于 2014-04-11 20:12:04
对于crypto-PRNG的人来说:
def generate_temp_password(length):
if not isinstance(length, int) or length < 8:
raise ValueError("temp password must have positive length")
chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
from os import urandom
# original Python 2 (urandom returns str)
# return "".join(chars[ord(c) % len(chars)] for c in urandom(length))
# Python 3 (urandom returns bytes)
return "".join(chars[c % len(chars)] for c in urandom(length))
请注意,对于均匀分布,chars
字符串长度应该是128的整数除数;否则,您将需要一种不同的方法来从空格中进行均匀选择。
发布于 2010-10-04 19:34:16
警告由于严重的安全问题,此答案应忽略!
选项#2看起来很合理,除非你可以添加一些改进:
''.join(choice(chars) for _ in range(length)) # in py2k use xrange
_
是一个常规的“我不在乎里面有什么”变量。而且你不需要理解列表,生成器表达式在str.join
上工作得很好。如果这是唯一正确的方式,也不清楚“慢”是什么意思。
https://stackoverflow.com/questions/3854692
复制相似问题