2017-06-15 2 views
-1

En fait, je suis bloqué avec l'analyse de rentabilisation suivante et je n'ai aucune idée de comment la résoudre.Python - Créer des millions de codes alphanumériques uniques avec de hautes performances

Je dois créer plus de 5.000.000 codes alphanumériques uniques.

Les règles pour les codes sont les suivants:

length: 12 
format: every 4 digits "-" 
some letters should be excluded like: O or l 

Les codes doivent être « fermé » (totalement aléatoire) et il devrait être possible d'exécuter le script plusieurs fois dans le cas où les codes ne suffisent pas et nous devons créer plus de codes.

par exemple. ab4D-406a-BCh7-TEs3

je dois résoudre ce en Python 3.

Ma première idée était de sauver les codes dans une base de données et il suffit de les créer avec la fonction aléatoire code ASCII -> Lettre mais peut-être le scirpt crée le même code deux fois donc je dois vérifier à chaque fois si ce code existe déjà dans la base de données ce qui va causer beaucoup de trafic de base de données.

Ma deuxième idée est d'utiliser une fonction de hachage, mais je pense que les codes ne seraient pas sécurisés et il n'y a pas de fonctions de hachage qui passent mes règles. Ma troisième idée est d'utiliser somethink comme un module aléatoire de python pour créer le code et écrire les codes dans un fichier et vérifier le fichier à chaque fois si le code est déjà à l'intérieur. Mais ce n'est pas bon pour la performance, mais je pense que plus que d'utiliser une base de données.

Quelqu'un peut-il trouver une solution à ce problème?

Salutations.

Edit:

J'ai essayé cela, mais il faut des heures pour créer les codes. Certains conseils comment augmenter la performance?

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

Vous dites que certains caractères doivent être exclus? Disons que 50 caractères restent. Cela fait 244x10^18 possibilités. Qu'est-ce qui vous retient pour les créer au hasard à la fois, les vider et vérifier les entrées non-uniques par la suite? Les chances de doubler semblent assez faibles ... si vous trouvez des doublons, supprimez-les et générez-en un nouveau pour ceux qui ont été supprimés. Laide, peut-être, mais une fois dans une base de données, tout devrait être assez rapide ... – Kraay89

+0

Copie possible de [Génération de chaîne aléatoire avec majuscules et chiffres en Python] (https://stackoverflow.com/questions/2257441/random -string-generation-with-majuscule-lettres-et-chiffres-en-python) –

+0

Je ne comprends pas. 'ab4D-406a-BCh7-TEs3' a 16 chiffres à l'exclusion de' -', mais vous avez dit que vous vouliez une longueur de 12. –

Répondre

0

La meilleure façon de générer des codes alphanumériques uniques est de générer un uuid, mais ils ne correspondent à vos « règles » - ils sont plus longs:

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

si vous découpez, vous perdez la partie UU de UUID, l'unicité –

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:]) 

prudence: ce ne peut pas garantie complètement aléatoire, mais fait le travail. sortie exemple:

'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

cryptage garantit l'unicité. Si vous cryptez les chiffres 0, 1, 2, ... 5 000 000, vous obtiendrez 5 000 001 résultats uniques garantis à condition de ne pas modifier la clé.

Votre prochain problème est comment changer le nombre binaire résultant dans le format désiré. Les caractères alphanumériques complets utilisent 26 + 26 + 10 = 62 caractères. Vous utilisez un sous-ensemble de cela, donc vous utiliserez moins de caractères, disons 58 caractères à titre d'exemple. Cela signifie que vous pouvez traiter votre sortie sous la forme d'un nombre de base de 12 chiffres 58 (ou autre).

12 chiffres dans la base 58 (ou autre) vous permettront de dimensionner le bloc binaire que vous chiffrez. Regardez Format Preserving Encryption pour vous assurer que la sortie de votre chiffrement est correctement dimensionnée pour vos besoins.