生成的最短的唯一ID

时间:2018-07-13 22:06:33

标签: python python-3.x uniqueidentifier

所以我们可以generate a unique id with str(uuid.uuid4()),它是36个字符长。

是否还有另一种方法来生成字符短的唯一ID?

编辑:

  • 如果ID可用作主键,则更好
  • 粒度应优于1ms
  • 此代码可以分发,所以我们不能假设时间独立。

3 个答案:

答案 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
  

[1] https://ux.stackexchange.com/a/53345