2017-08-14 49 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] –