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) 
+1

你说有些人物需要排除?比方说,剩余50个字符。这使得244x10^18种可能性。什么让你回来立即随机创建它们,转储它们并在之后检查非唯一条目?双打机会似乎很小......如果你找到双打,删除它们并为删除的那些生成一个新的。丑,也许,但一旦它在数据库中一切都应该足够快... – Kraay89

+0

[在Python中随机字符串生成与大写字母和数字]可能重复(https://*.com/questions/2257441/random -string-generation-with-upper-case-letters-and-digits-in-python) –

+0

我不明白。 'ab4D-406a-BCh7-TEs3'有16位数字,不包括'-',但你说你想要的长度为12。 –

生成唯一的字母数字代码最简单的方法是产生一个uuid,但他们不符合您的“规则” - 他们不再:

>>> import uuid 
>>> _id = uuid.uuid4() 
>>> print (_id) 
5d9efd48-661f-47f8-8886-13e93fd8b899 
>>> print (len(str(_id))) 
36 
>>> 
+1

如果你修剪,你失去了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以确保您的加密输出的大小正确满足您的要求。