【问题标题】:Generate a custom formated string with python使用 python 生成自定义格式化字符串
【发布时间】:2017-08-14 08:58:47
【问题描述】:

我有一个 Javascript 代码可以生成一个字符串(类似于 uuid)字符串

这里是js代码:

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)
})

如何用 python 生成这个字符串?

【问题讨论】:

  • binascii.b2a_hex(os.urandom(5))
  • 人们似乎认为您在问如何生成随机 UUID;你可能想澄清你的问题。
  • @Rawing 谢谢。我认为它现在已修复
  • 重新打开,因为这是重复的,但是,这个问题仍然没有意义。这不是 UUID,因为 type 字段是错误。另外,您为什么要生成不是普遍唯一的“普遍”唯一标识符(使用此代码将导致您的 UUID 不是普遍唯一的)。这个问题也不应该有 Javascript 标签,因为这个问题不是关于 javascript 的。
  • 绝对不是。 Javascript 知识并不能帮助他们用 Python 编写代码。

标签: python uuid


【解决方案1】:

使用正则表达式替换和 Python 3.6 的新 secrets 模块 - 这不等同于 JavaScript 代码,因为 此 Python 代码 是加密安全的,它产生的冲突/可重复序列较少。

secrets documentation says:

secrets 模块用于生成适用于管理密码、帐户身份验证、安全令牌和相关机密等数据的加密强随机数。

特别是,应该优先使用机密,而不是随机模块中的默认伪随机数生成器,该生成器是为建模和模拟而设计的,而不是安全或密码学。

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

您希望这让您的 ID 尽可能地唯一,而不是使用 Mersenne Twister MT19937 -using random,后者实际上是专门为生成 可重复 数字序列而构建的。

对于 Python

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

【讨论】:

  • 谢谢。很好的答案:)
  • @zaph Math.random() 的质量无法保证。此外,JavaScript 代码中仅使用了当前时间的 4 位最低位。
  • @zaph 不是choice,是secrets.choice
  • @zaph 这就是为什么有文档
  • 命名良好的函数和变量使代码更易于理解和维护,并降低 WTF/分钟速率。真的,使用描述性名称会杀死开发人员吗?不妨使用随机名称生成器并阅读文档。
【解决方案2】:

Python 默认提供UUID 生成:

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

【讨论】:

  • OP 的代码使用基于当前时间的算法创建一个 UUID。此代码不使用相同的算法。
【解决方案3】:

所以基本上你想要一些随机的十六进制数字:

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' 这样的字符串。

【讨论】:

  • 非常感谢。这正是我想要的。
  • 体重,它的 [8, 4, 4, 4, 8]
猜你喜欢
  • 2014-07-09
  • 2012-07-22
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多