有效地生成16个字符的字母数字字符串

2024-04-23 07:16:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种非常快速的方法来生成表中主键的字母数字唯一id。

想要这个吗?

def genKey():
    hash = hashlib.md5(RANDOM_NUMBER).digest().encode("base64")
    alnum_hash = re.sub(r'[^a-zA-Z0-9]', "", hash)
    return alnum_hash[:16]

生成随机数的好方法是什么? 如果我基于microtime,我必须考虑同时从不同实例调用genKey()的可能性。

还是有更好的方法来做这些?


Tags: 方法idnumberdef字母数字randomhash
3条回答

看看uuid module(Python 2.5+)。

一个简单的例子:

>>> import uuid
>>> uid = uuid.uuid4()
>>> uid.hex
'df008b2e24f947b1b873c94d8a3f2201'

注意,OP要求16个字符的字母数字字符串,但是UUID4字符串是32个字符长。不应截断此字符串,而应使用完整的32个字符。

由于没有一个答案为您提供由字符0-9、a-z、a-z组成的随机字符串:下面是一个工作解决方案,它将为您提供大约62^16=4.76724 e+28个键中的一个:

import random, string
x = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16))
print(x)

它也非常可读,而不需要知道ASCII代码的心脏。

自从python 3.6.2以来,还有一个更短的版本:

import random, string
x = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
print(x)

您可以使用:

>>> import random
>>> ''.join(random.choice('0123456789ABCDEF') for i in range(16))
'E2C6B2E19E4A7777'

不能保证生成的密钥是唯一的,因此您应该准备好在原始插入失败时使用新密钥重试。此外,您可能希望考虑使用确定性算法从自动递增的id生成字符串,而不是使用随机值,因为这将保证您的唯一性(但它也将提供可预测的键)。

相关问题 更多 >