python生成12位唯一标识

一直在用uuid作为数据库id,但是长度太长,所以想做个简单的id试下

# -*- coding: utf-8 -*-
import datetime,time,random

#10进制转换36进制
def hex36(num):
    # 正常36进制字符应为'0123456789abcdefghijklmnopqrstuvwxyz',这里我打乱了顺序
    key='t5hrwop6ksq9mvfx8g3c4dzu01n72yeabijl'
    a = []
    while num != 0:
        a.append(key[num%36])
        num = num / 36
    a.reverse()
    out = ''.join(a)
    return out

#获取唯一标识
def getId():
    #36进制位数对应10进制数范围参考:
    #1位:0-35
    #2位:36-1295
    #3位:1296-46655
    #4位:46656-1679615
    #5位:1679616-60466175
    #6位:60466176-2176782335

    # 只要秒数大于60466175,就可以转换出6位的36进制数,这里从2015年1月1日开始计算,约70年后会变成7位
    d1=datetime.datetime(2015,1,1)
    d2=datetime.datetime.now()
    #获取秒数
    s=(d2-d1).days*24*60*60
    #获取微秒数
    ms=d2.microsecond
    #随机两位字符串
    id1=hex36(random.randint(36, 1295))
    #转换秒数
    id2=hex36(s)
    #转换微秒数,加46656是为了保证达到4位36进制数
    id3=hex36(ms+46656)

    mId=id1+id2+id3
    return mId[::-1] 

并发一万次,重复次数几乎为0
并发十万次,重复次数10个以内

应该可以满足一般需求,以后再找更好的方案吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值