我有一个方法可以生成50,000个随机字符串,将它们全部保存到文件中,然后运行该文件,并删除所有出现的字符串重复项。在使用set()
生成唯一字符串后,在这50,000个随机字符串中,平均剩下63个字符串。
生成字符串的函数:
def random_strings(size=8, chars=string.ascii_uppercase + string.digits + string.ascii_lowercase):
return ''.join(random.choice(chars) for _ in xrange(size))
删除重复项:
with open("dicts/temp_dict.txt", "a+") as data:
created = 0
while created != 50000:
string = random_strings()
data.write(string + "\n")
created += 1
sys.stdout.write("\rCreating password: {} out of 50000".format(created))
sys.stdout.flush()
print "\nRemoving duplicates.."
with open("dicts\\rainbow-dict.txt", "a+") as rewrite:
rewrite.writelines(set(data))
之前和之后的示例: https://gist.github.com/Ekultek/a760912b40cb32de5f5b3d2fc580b99f
如何生成完全随机的唯一字符串而不重复?
答案 0 :(得分:3)
您可以从头开始使用 set
created = set()
while len(created) < 50000:
created.add(random_strings())
在循环外保存一次
答案 1 :(得分:0)
您可以通过生成唯一数字来保证唯一字符串,从随机数开始是可能性总数的1/50000 th 的范围(62 8 )。然后生成更多随机数,每次确定可以选择下一个数字的窗口。这不是完全随机,但我相信它实际上足够接近。
然后,通过考虑62个基数的表示,可以将这些数字转换为字符串。下面是代码,最后检查确实所有50000个字符串都是唯一的:
import string
import random
def random_strings(count, size=8, chars=string.ascii_uppercase + string.digits + string.ascii_lowercase):
max = len(chars) ** size - 1
start = 0
choices = []
for i in range(0,count):
start = random.randint(start, start + (max-start) // (count-i))
digits = []
temp = start
while len(digits) < size:
temp, i = divmod(temp, len(chars))
digits.append(chars[i])
choices.append(''.join(digits))
start += 1
return choices
choices = random_strings(50000)
# optional shuffle, since they are produced in order of `chars`
random.shuffle(choices)
# Test: output how many distinct values there are:
print (len(set(choices)))
上查看它
这会在线性时间内产生字符串。使用上述参数,您可以在平均PC上获得一秒钟的答案。