Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—创建百万个具有高性能的独特字母数字代码_Python_Performance_Random_Cryptography_Alphanumeric - Fatal编程技术网

Python—创建百万个具有高性能的独特字母数字代码

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解决这个问题 我的第一个想

事实上,我被以下商业案例困住了,不知道如何解决它

我必须创建超过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解决这个问题

我的第一个想法是将代码保存到数据库中,然后使用随机函数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',