所以我们可以generate a unique id with str(uuid.uuid4())
,它是36个字符长。
是否还有另一种方法来生成字符短的唯一ID?
编辑:
答案 0 :(得分:3)
如果这是要用作db中的主键字段,请考虑仅使用自动递增整数。
str(uuid.uuid4())
是36个字符,但是其中有四个无用的破折号(-
),并且仅限于0-9 a-f。
以32个字符显示更好的uuid4:
>>> uuid.uuid4().hex
'b327fc1b6a2343e48af311343fc3f5a8'
或者只是b64编码并切片一些urandom字节(由您来保证唯一性):
>>> base64.b64encode(os.urandom(32))[:8]
b'iR4hZqs9'
答案 1 :(得分:0)
是的。只需使用当前的UTC毫秒。这个数字永远不会重复。
invites = await client.invites_from(message.channel.server)
for invite in invite:
if invite.inviter == message.author:
print(invite.uses)
编辑
如果很少需要在同一毫秒内生成多个ID,则此方法没有用,因为该数字的粒度为1ms。
答案 2 :(得分:0)
这是Python3和PowerShell的函数,它将int32转换为字母数字ID,例如F2AXP8
。它将以6个字符编码大约10亿个ID,因此它尽可能紧凑,同时仍仅使用无歧义的[1]数字和字母。
如果您想要更紧凑的ID /代码/序列号,只需更改chars="..."
定义即可轻松扩展字符集。例如,如果允许所有大小写字母,则在相同的6个字符内可以有560亿个ID。添加一些符号(例如~!@#$%^&*()_+-=
),即可获得2080亿个ID。
但是,此集合(0123456789ACEFHJKLMNPRTUVWXY
)的优点是易于复制粘贴(没有符号,因此双击可以选择整个ID),易于阅读而不会出错(没有类似{{1 }}和2
),并且很容易进行口头交流(仅大写字母)。数字仅是您进行口头交流的最佳选择,但以紧凑为代价。
Python代码
Z
PowerShell代码
def int32_to_id(n):
if n==0: return "0"
chars="0123456789ACEFHJKLMNPRTUVWXY"
length=len(chars)
result=""
remain=n
while remain>0:
pos = remain % length
remain = remain // length
result = chars[pos] + result
return result