Kur*_*eek 32 python random uuid
Python模块的uuid4()函数uuid生成一个随机UUID,并且似乎每次生成一个不同的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')
Run Code Online (Sandbox Code Playgroud)
我希望每次运行脚本时都能生成相同的随机UUID - 也就是说,我想将随机生成器播种到uuid4().有没有办法做到这一点?(或通过其他方式实现这一点)?
我将使用uuid.UUID()带有随机128位整数(来自种子实例random.Random())的方法生成UUID 作为输入:
import uuid
import random
rd = random.Random()
rd.seed(0)
uuid.UUID(rd.getrandbits(128))
Run Code Online (Sandbox Code Playgroud)
但是,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'
Run Code Online (Sandbox Code Playgroud)
还有其他建议吗?
Ale*_*all 22
差不多了:
uuid.UUID(int=rd.getrandbits(128))
Run Code Online (Sandbox Code Playgroud)
这是在以下帮助下确定的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'.
Run Code Online (Sandbox Code Playgroud)
小智 14
这是基于此处使用的解决方案:
import hashlib
import uuid
m = hashlib.md5()
m.update(seed.encode('utf-8'))
new_uuid = uuid.UUID(m.hexdigest())
Run Code Online (Sandbox Code Playgroud)
h34*_*4cr 11
由于尚未发布生成一致的版本 4 UUID 的直接解决方案:
import random
import uuid
rnd = random.Random()
rnd.seed(123) # NOTE: Of course don't use a static seed in production
random_uuid = uuid.UUID(int=rnd.getrandbits(128), version=4)
Run Code Online (Sandbox Code Playgroud)
然后你可以在哪里看到:
>>> random_uuid.version
4
Run Code Online (Sandbox Code Playgroud)
这不仅仅是“模拟”版本信息。它创建了一个正确的 UUIDv4:
版本参数是可选的;如果给定,生成的 UUID 将根据 RFC 4122 设置其变体和版本号,覆盖给定的十六进制、字节、bytes_le、字段或 int 中的位。
cit*_*man 10
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
Run Code Online (Sandbox Code Playgroud)
如果有人需要在种子 UUID 中进行猴子修补,请在此处添加此内容。我的代码使用uuid.uuid4()但为了测试我想要一致的 UUID。以下代码是我的做法:
import uuid
import random
# -------------------------------------------
# Remove this block to generate different
# UUIDs everytime you run this code.
# This block should be right below the uuid
# import.
rd = random.Random()
rd.seed(0)
uuid.uuid4 = lambda: uuid.UUID(int=rd.getrandbits(128))
# -------------------------------------------
# Then normal code:
print(uuid.uuid4().hex)
print(uuid.uuid4().hex)
print(uuid.uuid4().hex)
print(uuid.uuid4().hex)
Run Code Online (Sandbox Code Playgroud)
基于@user10229295 的答案的简单解决方案,以及有关种子的评论。编辑队列已满,所以我打开了一个新答案:
import hashlib
import uuid
seed = 'Type your seed_string here' #Read comment below
m = hashlib.md5()
m.update(seed.encode('utf-8'))
new_uuid = uuid.UUID(m.hexdigest())
Run Code Online (Sandbox Code Playgroud)
关于字符串“seed”的评论:它将是生成 UUID 的种子:从相同的种子字符串将始终生成相同的 UUID。您可以将具有一定意义的整数转换为字符串,连接不同的字符串并将结果用作种子。这样您就可以控制生成的 UUID,这意味着您将能够在知道您使用的种子的情况下重现您的 UUID:使用相同的种子,从中生成的 UUID 将是相同的。
| 归档时间: |
|
| 查看次数: |
13164 次 |
| 最近记录: |