如何在Python中生成易于理解的唯一标识符?

17

如何生成一个独一无二的ID值,并可通过电话或电子邮件轻松传递,即使易于记忆,也不易于被猜测。

我使用数据库。但由于要将ID提供给不同的人使用,我不想让它与数据库绑定。我可以对已经在数据库中具有的唯一ID进行某些处理,但不能直接使用它,以避免被猜测。

我正在使用Python,尝试使用uuid,但uuid太长了,不易于人类阅读

有没有办法创建一个人性化的可发音的ID?


唯一于哪个基础?您是否拥有数据库,或者想要创建一个随机的字符串/数字,它不太可能与以下值发生冲突?请更详细地描述您的问题。 - schlamar
hash(str(your_id))是什么意思? - schlamar
1
你可以去掉哈希值,但这会更容易导致冲突。但这是你必须处理的问题。没有冲突->不可读,可读->可能发生冲突。 - schlamar
5个回答

13

那个故事是真的吗?不可能是真的。 - kbuilds

3

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

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

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

编辑: 既然您还想通过电话传递它们,也许b32encode(urandom(5))是更好的选择,因为它不会给您任何小写或不寻常的字符。


1
你能否解释一下为什么这是个坏主意,因为我自己也在使用它? - nima

2
像亚马逊的支付短语一样怎么样?将二进制ID转换为一系列英文单词。
如果您想要与UUID相同范围的东西,则需要表示16个字节。为了保持合理,将短语限制为4个单词,因此每个单词代表4个字节,或者65536个可能性,因此您需要一个有262144个单词的词典。
编辑: 实际上,反思后可能更好的是一种类似于疯狂填空句子的形式 - 它将限制所需单词的数量,并且由于具有语法结构,因此可能更容易记忆。当然,它将需要更长,可能像这样:
(a/an/the/#)(adj)(noun)(verb)(tense)(adverb)而(a/an/the/#)(adj)(noun)(verb)(adverb)。

如果您将“Foo Foo Foo Foo”视为有效的支付短语,那么65536个单词中的或。 - agf
你的编辑太过复杂了。只需要加载一个字典,然后使用 memorable_id = ''.join(dictionary[random.randint(0, 65535)] for Null in range(4)) 就更好了。 - agf

0
这是一个基于uuid的示例。调整1000000以增加或减少您的id范围。由于您正在缩小id范围,因此可能需要检查ID是否已存在。
>>> import uuid
>>> hash(str(uuid.uuid1())) % 1000000
380539
>>> hash(str(uuid.uuid1())) % 1000000
411563

2
随机性与唯一性无关。 - user395760
1
如果您不需要为同一对象再次生成相同的ID,则使用随机数与使用相同大小的哈希完全等效。 - agf

0

可以,但需要对问题空间进行更多限制,包括:

  1. 只有一个东西生成唯一的ID
  2. 您的项目具有某种标题概念
  3. 您可以持久化字符串列表

然后您可以执行以下操作:

_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

以上所述,这段代码有什么问题吗?它完全有效,并按照您提出的问题解决了它。 - MatthewWilkes
如果OP目前正在使用UUID,则几乎可以确定会有多个东西生成唯一ID,因为它几乎肯定是一个分布式系统。坦白地说,如果您可以集中生成ID,则问题很容易解决。 - Ian Goldby
OP使用uuid是因为它抵抗猜测。实际上,正如他们所说,他们已经有了一个带有唯一ID的数据库条目,这意味着问题空间不太可能是分布式系统。问题并不是生成唯一ID本身,而是选择一种方案,使口头表述时最小化错误,并且不允许枚举。一个例子是网站上的新闻项目,其中它们可能具有内部ID,但这会泄露有关未发布项目的信息。从根本上讲,问题在于这个问题是含糊不清的。 - MatthewWilkes

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