如何在Python中生成唯一ID?

Rya*_*yan 136 python random unique-id

我需要根据随机值生成唯一ID.

Mic*_*yan 148

也许uuid.uuid4()可以做这个工作.有关更多信息,请参阅uuid.

  • 已经5年了,还是一个问题吗? (30认同)
  • 注意,该模块底层的库是错误的,并倾向于分叉一个保持FD打开的进程.这已在新版本中修复,但大多数人可能还没有,所以我通常会避免使用此模块.听我的主要问题是收听插座... (24认同)
  • @GlennMaynard 9年后还在想 (17认同)
  • 问题似乎出在某些系统上的 os.urandom 上。UUID(int=random.getrandbits(128), version=4)) 表现良好。 (3认同)
  • 从未来来看,想知道过去的错误是否得到解决。 (3认同)
  • @MithunKinarullathil 现在没问题了 (3认同)
  • @Glenn:关于哪个版本有错误的更多细节?我在生产代码中使用它(并且即将在更新版本中推出更多用途).我现在很害怕! (2认同)
  • @Matthew:我不知道它是否已经修复,但是使用uuidlib的uuid后端在不关闭FD的情况下进行了分叉,因此我当时打开的TCP套接字永远不会关闭,以后也无法重新打开端口。我必须以root身份手动杀死`uuidd`。我通过将uuid._uuid_generate_time和uuid._uuid_generate_random设置为None来解决此问题,因此uuid模块从不使用本机实现。(无论如何,这确实应该是一个选项;完全不需要生成导致启动守护程序的V4随机UUID。) (2认同)

Dre*_*awn 106

您可能需要Python的UUID功能:

21.15.uuid - 根据RFC 4122的UUID对象

例如:

import uuid
print uuid.uuid4()
Run Code Online (Sandbox Code Playgroud)

7d529dd4-548b-4258-aa8e-23e34dc8d43d

  • 如果我们只想要特定数量的位数怎么办? (4认同)
  • 这应该是答案。更详细! (2认同)

Sin*_*ion 22

独特和随机是相互排斥的.也许你想要这个?

import random
def uniqueid():
    seed = random.getrandbits(32)
    while True:
       yield seed
       seed += 1
Run Code Online (Sandbox Code Playgroud)

用法:

unique_sequence = uniqueid()
id1 = next(unique_sequence)
id2 = next(unique_sequence)
id3 = next(unique_sequence)
ids = list(itertools.islice(unique_sequence, 1000))
Run Code Online (Sandbox Code Playgroud)

没有两个返回的id是相同的(唯一),这是基于随机种子值

  • 在这种情况下,即使是计数器也是唯一的。 (3认同)
  • 这不是唯一的.如果我启动它两次,并且每次产生一百万个值,那么两次运行之间发生碰撞的可能性就很大.为了避免这种情况,我每次都必须存放最后的"种子" - 然后就没有种子了; 它只是一个序列生成器.*统计*唯一ID通常由随机数据生成; 至少有一类UUID以这种方式工作. (2认同)

mlu*_*bke 6

import time
import random
import socket
import hashlib

def guid( *args ):
    """
    Generates a universally unique ID.
    Any arguments only create more randomness.
    """
    t = long( time.time() * 1000 )
    r = long( random.random()*100000000000000000L )
    try:
        a = socket.gethostbyname( socket.gethostname() )
    except:
        # if we can't get a network address, just imagine one
        a = random.random()*100000000000000000L
    data = str(t)+' '+str(r)+' '+str(a)+' '+str(args)
    data = hashlib.md5(data).hexdigest()

    return data
Run Code Online (Sandbox Code Playgroud)


Pjl*_*Pjl 6

也许这对你有用

str(uuid.uuid4().fields[-1])[:5]
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个好的解决方案。请参阅https://gist.github.com/randlet/65c3812c648517e365f1d774a0122d18 (10认同)
  • 是的,了解转换以及转换是否仍然独特会很好 (3认同)
  • 你能详细说明一下你得到的str吗 (2认同)
  • 这如何确保唯一性? (2认同)