如何在Python中生成易读的唯一ID?
我想生成一个独特的ID值,这个ID可以通过电话或电子邮件轻松传递,同时又容易记住,但又不容易被猜到。
我在使用数据库。不过,因为我要把这个ID给别人,所以我不想让它和数据库绑定在一起。我可以用我在数据库里已有的独特ID做点什么,但不能直接使用,以免别人容易猜到。
我在用Python,试过使用uuid
,但是uuid
太长了,人类不容易读懂。
有没有办法创建一个容易发音、友好的ID呢?
5 个回答
你觉得像亚马逊的支付短语那样的方式怎么样?把二进制的ID转换成一串英文单词。
如果你想要的范围和UUID一样大,你需要表示16个字节。为了让它更合理,可以把短语限制在4个单词,这样每个单词就代表4个字节,或者说65536种可能性,所以你需要一个包含262,144个单词的词典。
编辑:其实仔细想想,可能更好的方式是用一种类似填空游戏的句子——这样可以减少需要的单词数量,而且因为有语法结构,可能更容易记住。当然,这样的句子会更长,可能像这样:
(一个/一/那个/#) (形容词) (名词) (动词)(时态) (副词) 当 (一个/一/那个/#) (形容词) (名词) (动词) (副词)。
对于电子邮件,我使用的是:
from base64 import b64encode
from os import urandom
key = b64encode(urandom(9))
你可以通过改变数字来增加或减少长度。有时候你会看到 + 和 / 这些字符,如果你不想要的话,可以把它们去掉。
编辑:因为你可能还想通过电话传递这些内容,使用 b32encode(urandom(5))
可能会更好,因为这样不会出现小写字母或奇怪的字符。
你想做的事情是把音节拼在一起,创造出可以发音的假词。你可以用任何语言来创造音节,组合成可以发音和交流的词语,但这些词实际上是没有意义的。
这里有一篇文章,讲述了一个人是如何创建人类可读的UID(唯一标识符),并且可以用发音的方式来读出来,以及一些遇到的困难。
阅读上面的链接,可以了解一些在采用这种方法时需要考虑的困难。
你也可以直接使用一串字母,但可以把它们用北约音标字母表的方式来呈现,而不仅仅是字母本身。