当前位置: 首页 > 知识库问答 >
问题:

如何在 Python 中生成可重现(带有种子)的随机 UUID

冯星剑
2023-03-14

Python的模块< code>uuid的uuid4()函数生成一个随机uuid,似乎每次都会生成一个不同的:

In [1]: import uuid

In [2]: uuid.uuid4()
Out[2]: UUID('f6c9ad6c-eea0-4049-a7c5-56253bc3e9c0')

In [3]: uuid.uuid4()
Out[3]: UUID('2fc1b6f9-9052-4564-9be0-777e790af58f')

我希望每次运行脚本时都能生成相同的随机UUID,也就是说,我希望在uuid4()中种子随机生成器。有办法做到这一点吗?(或通过其他方式实现)?

我必须使用< code>uuid生成一个UUID。UUID()方法使用一个随机的128位整数(来自< code>random的种子实例。Random())作为输入:

import uuid
import random

rd = random.Random()
rd.seed(0)
uuid.UUID(rd.getrandbits(128))

然而,UUID()似乎不接受此输入:

Traceback (most recent call last):
  File "uuid_gen_seed.py", line 6, in <module>
    uuid.UUID(rd.getrandbits(128))
  File "/usr/lib/python2.7/uuid.py", line 133, in __init__
    hex = hex.replace('urn:', '').replace('uuid:', '')
AttributeError: 'long' object has no attribute 'replace'

还有其他建议吗?

共有3个答案

令狐跃
2023-03-14

这是基于此处使用的解决方案:

import hashlib
import uuid

m = hashlib.md5()
m.update(seed.encode('utf-8'))
new_uuid = uuid.UUID(m.hexdigest())
桂志诚
2023-03-14

Faker让这变得容易

>>> from faker import Faker
>>> f1 = Faker()
>>> f1.seed(4321)
>>> print(f1.uuid4())
cc733c92-6853-15f6-0e49-bec741188ebb
>>> print(f1.uuid4())
a41f020c-2d4d-333f-f1d3-979f1043fae0
>>> f1.seed(4321)
>>> print(f1.uuid4())
cc733c92-6853-15f6-0e49-bec741188ebb
荣晨朗
2023-03-14

几乎在那里:

uuid.UUID(int=rd.getrandbits(128))

这是在help的帮助下确定的:

>>> help(uuid.UUID.__init__)
Help on method __init__ in module uuid:

__init__(self, hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None) unbound uuid.UUID method
    Create a UUID from either a string of 32 hexadecimal digits,
    a string of 16 bytes as the 'bytes' argument, a string of 16 bytes
    in little-endian order as the 'bytes_le' argument, a tuple of six
    integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version,
    8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as
    the 'fields' argument, or a single 128-bit integer as the 'int'
    argument.  When a string of hex digits is given, curly braces,
    hyphens, and a URN prefix are all optional.  For example, these
    expressions all yield the same UUID:

    UUID('{12345678-1234-5678-1234-567812345678}')
    UUID('12345678123456781234567812345678')
    UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
    UUID(bytes='\x12\x34\x56\x78'*4)
    UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' +
                  '\x12\x34\x56\x78\x12\x34\x56\x78')
    UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
    UUID(int=0x12345678123456781234567812345678)

    Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must
    be given.  The 'version' argument is optional; if given, the resulting
    UUID will have its variant and version set according to RFC 4122,
    overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'.
 类似资料:
  • 问题内容: 我正在为学校项目这样做(因此我不能使用任何高级功能),并且我正在使用Python 2.6.6。 我有一个从1到1000的数字列表,我的种子将是448。 如何使用该种子生成随机序列,以便列表中的数字位于不同的索引中? 知道种子后,是否有可能将列表中的元素返回到初始位置? 抱歉,如果我的问题令人困惑,但是英语不是我的母语。 谢谢。 问题答案: 结果是 您的列表现已伪随机化。 “伪”很重要,

  • 问题内容: 我脑子里有一个大问题: 我可以使用种子数生成随机数: 但是我不明白的是那颗种子的作用。例如,有什么区别 该代码具有以下内容: 问题答案: 当您向one-arg 构造函数 提供特定的硬编码种子时,每次您运行该程序时,将生成的随机数将始终相同。当您需要可预测的随机数源时就需要这样做。 但是,当您不提供种子时,构造函数将根据为您选择一个种子。每次运行程序时,随机数都会不同,因为种子每次都会不

  • 本文向大家介绍如何在Python中生成非重复随机数?,包括了如何在Python中生成非重复随机数?的使用技巧和注意事项,需要的朋友参考一下 接下来的程序会生成10个介于1到100之间的随机非重复整数。它会在给定的时间间隔内生成一个随机整数,如果先前未添加过该整数,则将其添加到列表中。

  • 本文向大家介绍python如何生成各种随机分布图,包括了python如何生成各种随机分布图的使用技巧和注意事项,需要的朋友参考一下 在学习生活中,我们经常性的发现有很多事物背后都有某种规律,而且,这种规律可能符合某种随机分布,比如:正态分布、对数正态分布、beta分布等等。 所以,了解某种分布对一些事物有更加深入的理解并能清楚的阐释事物的规律性。现在,用python产生一组随机数据,来演示这些分布

  • 问题内容: 好的,这是一个比听起来更棘手的问题之一,所以我转向堆栈溢出,因为我想不到一个好的答案。这就是我想要的:我需要Python以随机顺序生成一个从0到1,000,000,000的简单数字列表,以用于序列号(使用随机数,这样您就无法知道已分配了多少个数字或进行了计时攻击也很容易,例如,猜测将要发生的下一个攻击)。这些数字与链接到它们的信息一起存储在数据库表(索引)中。生成它们的程序不会永远运行

  • 问题内容: 我想要一个可以生成值的伪随机序列的函数,但是该序列在每次运行时都可以重复。我想要的数据必须合理地随机分布在给定的范围内,而不必是完美的。 我想根据随机数据编写一些可以对其进行性能测试的代码。我希望每台机器上的每个测试运行的数据都相同,但是出于存储原因,我不想随测试一起运送随机数据(最终可能会变成许多兆字节)。 该模块的库似乎没有说相同的种子在任何机器上总是给出相同的序列。 编辑:如果您