我想每天生成100万个二维码。每个二维码都应该有随机唯一值。
为了实现唯一性,我有如下两个选项
1)第一个选项是生成 8 个字符的字母数字随机字符串并检查它是否存在于数据库中。如果不存在则存储在数据库中,如果存在则重试获取。
这种方法的问题是生成 100 万个唯一的字母数字字符串大约需要 45 分钟,因为我们必须每次检查生成的字母数字字符串是否存在于数据库中。
2) 第二个选项是通过附加 6 个字符的字母数字字符串和时间(小时+分钟+秒+日期+月+年)来生成唯一 token 。使用此选项,我能够在 5 分钟内生成 100 万个唯一的字母数字字符串。
我正在使用第二个选项,但此选项的问题是由此生成的字母数字字符串长度为 15 个字符。我想生成只有 8 个字符长的字母数字字符串。如果我使用第二个选项,那么时间戳本身需要 8 个字符,并且字符串很容易被猜到。
我想知道如何在不检查数据库中是否存在的情况下生成 8 个字符的随机且唯一的字母数字字符串。
最佳答案
使用set
结构就够了
def random_str(n):
base = 'abcefghijklmnopqrstuvwxzy0123456789'
return ''.join([base[ord(i) % len(base)] for i in os.urandom(n)])
s = set()
SIZE = 1000000
while len(s) < SIZE:
s.add(random_str(5))
而且,它大约需要 5 秒。
对不起,我每天都在思念。将8个字符拆分为拖尾部分:第一部分(3个字符)表示每天或其他条件,可以将其存储在Mysql中并在生成一次或使用1970年以来的天数之前查询并将其更改为基于36的数字。秒部分 5 个字符使用上面的代码生成唯一键。
关于mysql - 如何在不检查数据库中是否存在的情况下生成 8 个字符的唯一字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35193730/