Python—创建百万个具有高性能的独特字母数字代码
事实上,我被以下商业案例困住了,不知道如何解决它 我必须创建超过5000.000.000个唯一的字母数字代码 这些守则的规则如下:Python—创建百万个具有高性能的独特字母数字代码,python,performance,random,cryptography,alphanumeric,Python,Performance,Random,Cryptography,Alphanumeric,事实上,我被以下商业案例困住了,不知道如何解决它 我必须创建超过5000.000.000个唯一的字母数字代码 这些守则的规则如下: length: 12 format: every 4 digits "-" some letters should be excluded like: O or l 代码应该是“安全的”(即完全随机的),并且应该可以多次运行脚本,以防代码不够,我们必须创建更多代码 e、 g.ab4D-406a-BCh7-TEs3 我必须用Python 3解决这个问题 我的第一个想
length: 12
format: every 4 digits "-"
some letters should be excluded like: O or l
代码应该是“安全的”(即完全随机的),并且应该可以多次运行脚本,以防代码不够,我们必须创建更多代码
e、 g.ab4D-406a-BCh7-TEs3
我必须用Python 3解决这个问题
我的第一个想法是将代码保存到数据库中,然后使用随机函数ASCII Code->Letter创建代码,但可能scirpt会创建两次相同的代码,因此每次我都要检查数据库中是否已经存在该代码,这将导致大量数据库流量
我的第二个想法是使用散列函数,但我认为代码不安全,并且没有通过我的规则的散列函数
我的第三个想法是使用类似python中的随机模块的somethink来创建代码,并将代码写入文件,如果代码已经在文件中,则每次都检查文件。但这对性能也不好,但我认为比使用数据库更好
有人知道如何高效地解决这个问题吗
import random
sequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
seq = list(sequence)
codelist = []
counter = 0
while len(codelist) < 5000000:
code = ""
counter = counter +1
print(counter)
while len(code) < 12:
code = code + str(random.choice(seq))
try:
codelist.index(code)
except ValueError:
codelist.append(code)
file = open('codefile.txt','w')
for item in codelist:
file.write("%s\n" % item)
你好
编辑:
我试过了,但创建代码需要几个小时。一些技巧如何提高性能
import random
sequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
seq = list(sequence)
codelist = []
counter = 0
while len(codelist) < 5000000:
code = ""
counter = counter +1
print(counter)
while len(code) < 12:
code = code + str(random.choice(seq))
try:
codelist.index(code)
except ValueError:
codelist.append(code)
file = open('codefile.txt','w')
for item in codelist:
file.write("%s\n" % item)
随机导入
sequence=“ABCDEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZ0123456789”
seq=列表(顺序)
代码列表=[]
计数器=0
而len(代码列表)<5000000:
code=“”
计数器=计数器+1
打印(计数器)
而len(代码)<12:
代码=代码+str(随机选择(seq))
尝试:
代码列表.索引(代码)
除值错误外:
代码列表。追加(代码)
file=open('codefile.txt','w')
对于代码列表中的项目:
file.write(“%s\n”%item)
生成唯一字母数字代码的最简单方法是生成一个,但它们不符合您的“规则”-它们更长:
>>> import uuid
>>> _id = uuid.uuid4()
>>> print (_id)
5d9efd48-661f-47f8-8886-13e93fd8b899
>>> print (len(str(_id)))
36
>>>
加密保证唯一性。如果加密数字0、1、2。。。5000000如果您不更改密钥,您将获得5000001保证的唯一结果 下一个问题是如何将生成的二进制数更改为所需的格式。全字母数字使用26+26+10=62个字符。您使用的是其中的一个子集,因此您将使用更少的字符,例如58个字符。这意味着您可以将输出视为12位数的基数58(或任何数字)
以58为基数的12位数字(或任何数字)将允许您调整加密的二进制块的大小。查看以确保加密输出的大小符合您的要求。如果进行修剪,则会丢失UUID的UU部分,即唯一性。您说需要排除某些字符吗?假设剩下50个字符。这使得244x10^18成为可能。是什么阻碍了你一次随机创建它们,然后转储它们并检查非唯一条目?双打的机会似乎很小。。。如果您找到了重复项,请将其删除,并为已删除的项生成新的重复项。丑陋,也许,但一旦它是在一个数据库中,一切都应该足够快…可能重复的我不明白
ab4D-406a-BCh7-TEs3
有16个数字,不包括-
,但您说您想要12个长度。您应该记住,如果生成由四个字母组成的无限代码,您将进入一个带打字机的猴子场景。你的一些代码可能类似于莎士比亚,但其他代码可能会变得非常粗俗和/或无礼。我没有想到这一点。非常好的评论,谢谢!
'FD58-KGIo-yBGL',
'q9jv-tDa4-K3ae',
'BrGr-AO9o-GkfN',
'VyKb-NHh2-HRHM',
'g3Eu-aPsv-2YgF',
'iPxB-p4GV-f5tM',
'jewn-NWnM-kUDw',
'gDWY-MZB4-OysT',
'Acbu-kpTG-TCMm',
'rHBz-yJca-s9aA',
'2nnH-WFgT-gQef',
'2qSz-kX8z-qDpi',
'FnjV-sgzj-gzWt',
'5uwW-jwM5-FxB6',