2014-12-13 76 views
3

我想生成一個隨機的短十六進制字符串(比如8位或16位)。Python生成隨機:uuid v。md5 v。隨機效率最高或效率低*

有噸的選項要做到這一點例如,從我的頭頂:

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

什麼我不知道是如果有任何理由,任何這些方法會更有效比任何其他人,或相反,如果一個人會特別是埃維利效率低下

任何人都有這個好油?

最便宜的任何建議的方式在python中做這個操作?

+1

你打算與這些字符串十六進制來幹什麼?爲什麼表現如此重要? – 2014-12-13 05:49:37

+0

@JohnKugelman只是好奇。我很想知道md5 v。uuid的效率,特別是一段時間(作爲標識符存儲)。是什麼促使Q是一個玩具項目,我只需要一些很小的東西,UUID是巨大的過度殺傷力和醜陋的後果。 – Williams 2014-12-13 05:52:54

+0

另外,直覺上,uuid和md5似乎很昂貴,但可能會在其他某一天專門提出另一個問題。謝謝! – Williams 2014-12-13 05:57:10

回答

4

最好問你想要什麼: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回報加密安全隨機數據。

5

試戴:

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