如何生成一个可以通过电话或电子邮件轻松传递的唯一ID值,这些值很容易记住,但仍然不容易猜到。
我正在使用数据库。但是当我向人们赠送ID时,我不希望它被绑定到数据库。我可以使用我在数据库中已有的唯一ID来某些,但不能直接使用它,以避免被猜到。
我使用的是Python,并尝试使用uuid
,但uuid
太长,无人类可读。
有没有办法创建人性化的可识别ID?
答案 0 :(得分:12)
你想要做的是将音节拼接在一起以创建可发音的伪词。您可以使用您喜欢的任何语言创建音节,以构成可以发音和传达的单词,但实际上并不意味着什么。
阅读以上链接,了解在采取此类方法时应考虑的一些陷阱。
你可以使用一串字母但是将它们显示为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)
当然,但它需要对您的问题空间进行一些限制,即:
然后你会做类似的事情:
_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