Python 生成16位唯一ID/UUID

# -*- coding:utf-8 -*-
import time


class UUID:
    def __init__(self, data_id=0):
        """
        :param data_id: 自定义项目id
        """
        self.data_id = data_id
        self.now = int(time.time())
        self.UUID = 0

    @staticmethod
    def as_stamp(hms):
        raw_time = time.strptime(f"1970-01-02 {hms}", "%Y-%m-%d %H:%M:%S")
        # 因时间戳是从1970年1月1号八点整开始计算的,所以要加上一天,再减去16个小时(57600秒)的时间,防止出现负数
        return str(int(time.mktime(raw_time) - 57600)).zfill(5)

    def uuid(self):  # 代码顺序不能调整
        """ [6位年月日][4位自增序号][1位项目ID][5位一天内的时间戳] 共16位组成
        :return: 百年内唯一id
        """
        number = str(self.generate_num()).zfill(4)  # 秒内自增序号(max9999)
        date_tuple = time.localtime(self.now)  # 时间戳转时间元组
        hms_stamp = self.as_stamp(time.strftime("%H:%M:%S", date_tuple))  # 把时分秒转为时间戳
        ymd = time.strftime("%y%m%d", date_tuple)  # 年月日
        return f'{ymd}{number}{self.data_id}{hms_stamp}'

    def generate_num(self):
        now = int(time.time())
        if self.now == now:  # 时间差在1秒内序号自增
            self.UUID += 1
        else:  # 不同时间差,序列号重新置为0
            self.UUID = 0
            self.now = now
        if self.UUID == 9999:  # 序号长度不足,等待一秒
            time.sleep(1)
            return self.generate_num()  # 返回自己重新来过
        return self.UUID


if __name__ == '__main__':
    obj = UUID()
    while True:
        print(obj.uuid())

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlCV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值