2017-08-14 86 views
-2

自定義格式化字符串我有一個生成的字符串(類似UUID)字符串生成與Python

這是JS代碼的Javascript代碼:

var t = "xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxx" 
    , i = (new Date).getTime(); 
return e = t.replace(/[x]/g, function() { 
    var e = (i + 16 * Math.random()) % 16 | 0; 
    return i = Math.floor(i/16), 
    e.toString(16) 
}) 

我能在這個字符串蟒蛇?

+0

'binascii.b2a_hex(os.urandom(5))' –

+1

人們似乎認爲你詢問如何生成隨機的UUID;你可能想澄清你的問題。 –

+0

@Rawing thx。我認爲現在已修復 –

回答

6

使用正則表達式替換和新secrets模塊的Python 3.6 - 因爲這Python代碼是加密安全和它產生較少的衝突/可重複的序列,這是不等同於JavaScript代碼。

secrets documentation says

祕密模塊用於生成適合於管理如密碼數據加密的強隨機號碼,帳戶認證,安全令牌,以及相關的祕密。

特別是,祕密應該優先於隨機模塊中的默認僞隨機數生成器,它被設計用於建模和仿真,而不是安全或密碼學。

>>> import re 
>>> from secrets import choice 
>>> re.sub('x', 
      lambda m: choice('abdef'), 
      'xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxx') 
'5baf40e2-13ef-4692-8e33-507b-40fb84ff' 

你會想這對於你的ID,以成爲真正儘可能獨特的,而不是這實際上是建立在明確得到號碼重複序列Mersenne Twister MT19937 - 使用random

對於Python < 3.6,你可以做

try: 
    from secrets import choice 
except ImportError: 
    choice = random.SystemRandom().choice 
+0

謝謝。很好的回答:) –

+0

@zaph'Math.random()'的質量不能保證。此外,JavaScript代碼中只使用當前時間的4位最低位。 –

+0

@zaph c.f. https://stackoverflow.com/a/3357323/918959 –

1

Python的默認提供UUID代:

>>> import uuid 
>>> uuid.uuid4() 
UUID('bd65600d-8669-4903-8a14-af88203add38') 
>>> str(uuid.uuid4()) 
'f50ec0b7-f960-400d-91f0-c42a6d44e3d0' 
>>> uuid.uuid4().hex 
'9fe2c4e93f654fdbb24c02b15259716c' 
+0

OP的代碼使用基於當前時間的算法創建UUID。此代碼不使用相同的算法。 –

+0

這不是我想成爲,但無論如何thx。 –

1

所以基本上你想要一些隨機的十六進制數字:

from random import randint 
'-'.join(''.join('{:x}'.format(randint(0, 15)) for _ in range(y)) for y in [10, 4, 4, 4, 10]) 

其中10,4,4,4,10在各段的長度你的格式字符串。你可能想添加一個種子,但基本上這就是你的JS代碼所做的,產生像'f693a7aef0-9528-5f38-7be5-9c1dba44b9'這樣的字符串。

+0

非常感謝。這正是我想要的。 –

+0

bwt,其[8,4,4,4,8] –