我想生成一个随机的短十六进制字符串(比如说8位或16位)。
有很多选择可以做到这一点,例如,从头顶开始:
uuid.uuid4().hex[:8]
md5().hexdigest()[:8]
"{0:08x}".format(int(random.random()*1000000000))[:8]
我想知道的是,是否有任何理由为什么这些方法比其他任何方法更有效,或者反之如果一个人特别邪恶低效
有人对此有任何好的油吗?
有关最便宜的在python中执行此操作的方法的建议吗?
答案 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
会返回加密安全的随机数据。