Python生成随机:uuid v.md5 v.random,效率最高或效率最低*

Wil*_*ams 5 python random performance

我想生成一个随机的短十六进制字符串(比如说8位或16位).

有很多选择可以做到这一点,例如,从我的头脑中:

uuid.uuid4().hex[:8]
md5().hexdigest()[:8]
"{0:08x}".format(int(random.random()*1000000000))[:8]
Run Code Online (Sandbox Code Playgroud)

我想知道的是,是否有任何理由为什么这些方法中的任何一种方法都比其他方法更有效,或者反之如果一种方法效率特别低效

有人对此有任何好的油吗?

有关在python中以最便宜的方式执行此操作的任何建议吗?

U2E*_*EF1 9

试试看:

> %timeit uuid.uuid4().hex[:8]
100000 loops, best of 3: 7.46 µs per loop

> %timeit "{0:08x}".format(random.randint(0, 0xffffffff))
100000 loops, best of 3: 2.05 µs per loop

> %timeit binascii.hexlify(os.urandom(4))
1000000 loops, best of 3: 1.74 µs per loop
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这些位random不适合加密目的,因此虽然它可能是最快的,但可能仍然不是你想要的.

如果你正在寻找疯狂的效率,只需事先得到一大堆随机数据:)

> randomdata = binascii.hexlify(os.urandom(1024))
> %timeit randomdata[64:72]
10000000 loops, best of 3: 101 ns per loop
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 5

最好问你想要什么:4个随机字节转换为十六进制.这可以确保您获得与您要求的完全相同的熵.

>>> binascii.hexlify(os.urandom(4))
'da20d2bd'
>>> binascii.hexlify(os.urandom(4))
'3266db8e'
>>> binascii.hexlify(os.urandom(4))
'4eb079dd'
>>> binascii.hexlify(os.urandom(4))
'46e3265e'
Run Code Online (Sandbox Code Playgroud)

作为奖励,urandom返回加密安全的随机数据.