在Python/Django中生成唯一字符串

33

我想在我的网站上为用户生成一个大小为5的字符串(密钥),类似于BBM PIN。

该密钥将包含数字和大写英文字母:

  • AU1B7
  • Y56AX
  • M0K7A

即使我生成数百万个字符串,我也希望能够放心地保证其唯一性。

请问最Pythonic的方法是什么?


1
base64.b32encode('12345') == 'GEZDGNBV' - Paulo Scardine
1
请参阅 https://github.com/jbittel/base32-crockford。 - Paulo Scardine
2
您可以使用 django.utils.crypto.get_random_string(5, string.ascii_uppercase+string.digits) 生成它们。您可能希望限制字符集,以避免生成可能在某些字体中难以辨认的混淆字符串,例如 l1I1l。唯一性需要您持久化分配的字符串集合。 - mhawke
1
你不能同时拥有“随机”和“唯一”。请将“随机”替换为“看起来随机”。 - Ignacio Vazquez-Abrams
3
因为我是梦想的破坏者,痛苦和绝望的带来者。绝望和痛苦。 - Ignacio Vazquez-Abrams
显示剩余3条评论
12个回答

1

这里提供一种生成长度为5或任意长度代码的解决方案:

import shortuuid as su
n = int(input("# codes to gen: "))
l = int(input("code lenght: "))
shou = su.ShortUUID(alphabet="QWERTYUIOPASDFGHJKLZXCVBNM0123456789")
codes = set()
LEN_CNT = 0

with open('file.txt', 'w') as file:
    while len(codes) < n:
        cd = shou.random(length=l)
        codes.add(cd)
        if len(codes) > LEN_CNT:
            LEN_CNT = len(codes)
            file.write(f"{cd}\n")

有时候 shortuuid 会生成重复的代码,因此我使用 set 来处理这个问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接