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

时间:2014-12-13 05:48:09

标签: python performance random

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

有很多选择可以做到这一点,例如,从头顶开始:

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

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

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

有关最便宜的在python中执行此操作的方法的建议吗?

2 个答案:

答案 0 :(得分:7)

试试看:

> %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

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

如果您正在寻找疯狂的效率,请事先获取一大堆随机数据:)

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

答案 1 :(得分: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'

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