【问题标题】:How to create a 8 digit Unique ID in Python?如何在 Python 中创建一个 8 位的唯一 ID?
【发布时间】:2017-03-09 18:39:45
【问题描述】:

我正在制作一个用于练习的网络应用程序,它是一个工作门户。我想为最终用户可见的作业创建 8 位唯一 ID。 ID 可以有数字和字母。模式需要是 8 位数字,没有连字符或破折号,如 XXXXXXXX

我知道 python 中有 UUID 的东西。但他们似乎以特定格式生成 id。有没有办法以我所需的格式获取 id?如果不能,请指导我如何去做?

我知道有一个类似的线程How can I generate a unique ID in Python?;但它没有具体回答我的问题。它没有回答我想要实现的目标。

提前致谢。

【问题讨论】:

标签: django python-3.x uuid


【解决方案1】:

你可以使用uuid.hex

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

或者 Django 也有辅助函数 get_random_string,它接受两个参数 length (default=12)allowed_chars:

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

【讨论】:

  • 可能值得一提的是,uuid4 中只有字母字符 a-f。 Django 的辅助函数会是更好的选择。
  • 使用.lower() 会产生偏差,因为现在小写字母出现的可能性是数字的两倍。如果只需要小写+数字,最好使用allowed_chars参数。
  • Django 辅助函数完成了我一直在寻找的技巧。谢谢。
  • @knbk 我现在已将其从答案中删除。谢谢!
【解决方案2】:

对数据使用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 安全版本:base64.urlsafe_b64encode()base64.urlsafe_b64decode() .参考:docs.python.org/3/library/base64.html
【解决方案3】:

TLDR:使用hashids在顺序整数和随机字符串之间进行一对一的转换

如果您正在创建一个 Web 应用程序并且需要将像 'x4ua9fam' 这样的字符串 id 映射到数据库中的某个条目,那么您需要一种强大的一对一方法来在整数和字符串 id 之间来回转换。

您可以将下一个可用的连续整数(0, 1, 2, ...) 分配给每个新项目,并将encode 分配给使用hashids 的唯一字符串,而不是每次生成一个随机id 并检查它是否已被占用。当用户请求字符串时,您可以将其decode 重新转换为整数并获取您的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多