如何在Python中创建一个包含8位数字的唯一标识符?

17

我正在制作一个网页应用程序作为练习,它是一款职位门户网站。我想为职位创建8位数字唯一ID,这些ID将对最终用户可见。ID可以包含数字和字母。模式需要是8个数字,没有连字符或破折号,就像XXXXXXXX那样。

我知道Python中有UUID的东西。但是它们似乎会按照它们特定的格式生成ID。是否有办法以我的所需格式获取ID?如果不能,请有人指导我该如何做?

我知道有一个类似的线程如何在Python中生成唯一ID?;但它并没有明确回答我的问题。它没有回答我试图实现的内容。

提前致谢。


不好意思打广告:请使用我在 https://github.com/scardine/coupon-encode 上的优惠码生成器。 - Paulo Scardine
可能是如何在Python中生成唯一ID?的重复问题。 - Morishiri
3个回答

38

你可以使用uuid.hex

import uuid
uuid.uuid4().hex[:8]  # Might reduce uniqueness because of slicing

Django也有一个帮助函数get_random_string,它接受两个参数length(默认为12)allowed_chars

from django.utils.crypto import get_random_string
get_random_string(8)

值得一提的是,uuid4 中只会包含字母字符 a-f。Django 的辅助函数将是更好的选择。 - wim
1
使用.lower()会产生偏差,因为现在小写字母出现的概率是数字的两倍。如果您只想要小写字母+数字,最好使用allowed_chars参数。 - knbk
Django的辅助函数解决了我正在寻找的问题。谢谢。 - RyuCoder
@knbk 我已经从答案中将其删除了。谢谢! - Aamir Rind

7
使用os.urandom获取数据,然后进行base64编码;
In [1]: import os

In [2]: import base64

In [3]: base64.b64encode(os.urandom(6)).decode('ascii')
Out[3]: '6Amtry80'

这解决了我的使用情况!尽管Base64字母表包含像“+”和“/”这样的字符,它们在URL和文件系统名称中不安全,因此我使用了编码/解码函数的url-safe版本:base64.urlsafe_b64encode()base64.urlsafe_b64decode()。参考:https://docs.python.org/3/library/base64.html - tnwei

2
TLDR: 使用hashids将顺序整数和随机字符串之间进行一对一转换。
如果您正在创建 Web 应用程序并需要将字符串 ID(如'x4ua9fam')映射到数据库中的某个条目,则需要一种强大的一对一方法来在整数和字符串 ID 之间进行转换。
您可以为每个新项目分配下一个可用的顺序整数(0、1、2、...),并使用 hashids 将其编码为唯一字符串,而不是每次生成随机 ID 并检查它是否被占用。当用户请求该字符串时,您可以将其解码回整数并获取数据。

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