Python - 创建数百万个具有高性能的独特字母数字代码
实际上,我被以下商业案例所困,并且不知道如何解决它。Python - 创建数百万个具有高性能的独特字母数字代码
我必须创建超过5.000.000个独特的字母数字代码。
为代码的规则是:
length: 12
format: every 4 digits "-"
some letters should be excluded like: O or l
的代码应该是“安全的”(即完全随机的),它应该是可能的多次运行脚本的情况下,代码是不够的,我们必须创建更多的代码。
例如ab4D-406a-BCh7-TEs3
我在Python来解决这个3.
我的第一个想法是代码保存到一个数据库,并刚刚与随机函数ASCII码创建它们 - >信,但也许scirpt创建相同的代码两次,所以我必须每次检查数据库中是否存在该代码,这将导致大量数据库通信。
我的第二个想法是使用散列函数,但我认为代码不安全,并且没有通过我的规则的散列函数。
我的第三个想法是使用Python这样的随机模块来创建代码并将代码写入文件,并在代码已经在里面时每次检查文件。但是这对性能也不好,但我认为比使用数据库要好。
任何人的想法如何解决高性能的问题?
问候。
编辑:
我试过,但它需要时间来创建代码。一些提示如何提高性能?
import random
sequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
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)
生成唯一的字母数字代码最简单的方法是产生一个uuid,但他们不符合您的“规则” - 他们不再:
>>> import uuid
>>> _id = uuid.uuid4()
>>> print (_id)
5d9efd48-661f-47f8-8886-13e93fd8b899
>>> print (len(str(_id)))
36
>>>
如果你修剪,你失去了UUID的UU部分,唯一性 –
from threading import Thread
UUIDs = []
for i in range(100):
t = Thread(target= generate_alphanum, args=(UUIDs,))
t.start()
def generate_alphanum(g_list):
while len(g_list) < 50000:
uid = ''.join(random.choice(string.ascii_letters + string.digits[2:]) for _ in range(12))
if uid not in g_list:
g_list(uid[:4] + '-' + uid[4:8] + '-' + uid[8:])
注意:这可能无法保证完全随机,但完成工作。 采样输出:
'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',
加密保证唯一性。如果您对数字0,1,2,... 5,000,000进行加密,您将得到5,000,001保证的独特结果,但不会更改密钥。
您的下一个问题是如何将生成的二进制数字更改为您所需的格式。完整的字母数字使用26 + 26 + 10 = 62个字符。您正在使用它的一个子集,因此您将使用较少的字符,例如58个字符。这意味着您可以将您的输出视为一个12位数的基数(或其他)。
基数为58的数字(或其他)将允许您调整您加密的二进制数据块的大小。查看Format Preserving Encryption以确保您的加密输出的大小正确满足您的要求。
你说有些人物需要排除?比方说,剩余50个字符。这使得244x10^18种可能性。什么让你回来立即随机创建它们,转储它们并在之后检查非唯一条目?双打机会似乎很小......如果你找到双打,删除它们并为删除的那些生成一个新的。丑,也许,但一旦它在数据库中一切都应该足够快... – Kraay89
[在Python中随机字符串生成与大写字母和数字]可能重复(https://*.com/questions/2257441/random -string-generation-with-upper-case-letters-and-digits-in-python) –
我不明白。 'ab4D-406a-BCh7-TEs3'有16位数字,不包括'-',但你说你想要的长度为12。 –