如何在Python中生成人性化的唯一ID?

时间:2011-07-20 12:30:27

标签: python random unique uniqueidentifier

如何生成一个可以通过电话或电子邮件轻松传递的唯一ID值,这些值很容易记住,但仍然不容易猜到。

我正在使用数据库。但是当我向人们赠送ID时,我不希望它被绑定到数据库。我可以使用我在数据库中已有的唯一ID来某些,但不能直接使用它,以避免被猜到。

我使用的是Python,并尝试使用uuid,但uuid 太长,无人类可读

有没有办法创建人性化的可识别ID?

5 个答案:

答案 0 :(得分:12)

你想要做的是将音节拼接在一起以创建可发音的伪词。您可以使用您喜欢的任何语言创建音节,以构成可以发音和传达的单词,但实际上并不意味着什么。

Here is an article about how one person created human readable UIDs for speaking them phonetically and some of the pitfalls.

阅读以上链接,了解在采取此类方法时应考虑的一些陷阱。

你可以使用一串字母但是将它们显示为NATO phonetic alphabet而不是字母。

答案 1 :(得分:3)

对于电子邮件,我使用的是:

from base64 import b64encode
from os import urandom
key = b64encode(urandom(9))

您可以通过更改数字来增加/减少长度。 有时候你会得到+和/字符,如果你愿意,可以将它们删除。

修改 既然你也希望通过电话传递它们,那么b32encode(urandom(5))会是更好的选择,因为它不会给你任何小写或不寻常的字符。

答案 2 :(得分:2)

亚马逊的薪资短语怎么样?将二进制ID转换为英语单词序列。

如果您想要与UUID具有相同范围的内容,则需要表示16个字节。 为了保持合理,将短语限制为4个单词,因此每个单词代表4个字节,或65536种可能性,因此您需要一个262,144个单词的字典。

编辑: 实际上反思可能更好的是一种疯狂的lib句子 - 它会限制所需单词的数量,并且可以使它更容易记住,因为它具有语法结构。当然,它可能需要更长时间,或许是这样的:

(a / an / the /)(adj)(名词)(动词)(时态)(副词)while(a / an / the /#)(adj)(名词)(动词)(副词)。

答案 3 :(得分:0)

这是一个基于uuid的例子。调整1000000以增加或减少ID的范围。由于您正在减少ID的范围,因此您可能需要检查ID是否已存在。

>>> import uuid
>>> hash(str(uuid.uuid1())) % 1000000
380539
>>> hash(str(uuid.uuid1())) % 1000000
411563

答案 4 :(得分:0)

当然,但它需要对您的问题空间进行一些限制,即:

  1. 只有一件事生成唯一ID
  2. 您的商品有一些标题概念
  3. 您可以保留字符串列表
  4. 然后你会做类似的事情:

    _UID_INTERNALS = set()
    
    def getID(obj):
        if hasattr(obj, 'UID'):
            return obj.UID
        title = obj.title.encode("ascii", errors="ignore")
        title = title.lower()
        title = "-".join(title.split())
        if not title:
            title = "unnamed-object"
        UID = title
        num = 1
        while UID in _UID_INTERNALS:
            UID = title + str(num)
            num += 1
        _UID_INTERNALS.add(UID)
        obj.UID = UID
        return UID