2017-06-15 39 views
-1

實際上,我被以下商業案例所困,並且不知道如何解決它。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://stackoverflow.com/questions/2257441/random -string-generation-with-upper-case-letters-and-digits-in-python) –

+0

我不明白。 'ab4D-406a-BCh7-TEs3'有16位數字,不包括'-',但你說你想要的長度爲12。 –

回答

0

生成唯一的字母數字代碼最簡單的方法是產生一個uuid,但他們不符合您的「規則」 - 他們不再:

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

如果你修剪,你失去了UUID的UU部分,唯一性 –

0
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', 
1

加密保證唯一性。如果您對數字0,1,2,... 5,000,000進行加密,您將得到5,000,001保證的獨特結果,但不會更改密鑰。

您的下一個問題是如何將生成的二進制數字更改爲您所需的格式。完整的字母數字使用26 + 26 + 10 = 62個字符。您正在使用它的一個子集,因此您將使用較少的字符,例如58個字符。這意味着您可以將您的輸出視爲一個12位數的基數(或其他)。

基數爲58的數字(或其他)將允許您調整您加密的二進制數據塊的大小。查看Format Preserving Encryption以確保您的加密輸出的大小正確滿足您的要求。