python利用多进制转换生成唯一ID

为了简化URL路径或是生成唯一的文章ID,在不考虑分布式情况下,想到这个思路:将时间以毫秒 转换成多进制,缩短位数。
其中可以加入随机数来减少或避免重复。多进制可以用到0-9,a-z, A-Z 这些数字,小写字母,大写字母,共计62个字符。

于是先找到个python生成多进制数的方法改良下:

import string

def xbase(n, x):
    # n为待转换的十进制数,x为机制,取值为2-62
    a = string.digits + string.ascii_letters
    b = []
    while True:
        s = n // x  # 商
        y = n % x  # 余数
        b = b + [y]
        if s == 0:
            break
        n = s
        b.reverse()
    return ''.join([str(a[i]) for i in b])

其中用到string这个包,python原生带的。

再将时间取成毫秒转成字符,前缀加上随机数,用上述的 xbase 生成,最终为12位字符串

import time
r = random.randint(1000, 9999)
t = str(time.time()).replace('.', '')
s = '{0}{1}'.format(r, t)
ks = xbase(int(s), 62)
print(ks)
# ceRInMTFV8y3

生成的结果如 '6J9tl8ElTdaf', 'f2OTVP3nuNaT', 'hopXecBjNl5R'  ,
上述之所以在时间前加前缀,是因为时间戳开始的字符都是一致的,以致于生成后的字符串看起前缀都一样了。