You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中生成无碰撞的10位唯一ID?

生成10位唯一且不可猜测ID的Python方案

针对你需要生成10位唯一、低碰撞、不可猜测ID的需求,以下是几个可行的方案:

方案1:UUID哈希截断法

通过对UUID进行哈希处理后截取前10位,大幅降低碰撞概率,同时保持随机性。UUID本身有足够的熵,经过SHA-256哈希后分布更均匀,远优于直接截取UUID前缀。

import uuid
import hashlib

def generate_unique_id():
    # 生成UUID4并转换为字节串
    uuid_bytes = uuid.uuid4().bytes
    # 用SHA-256哈希提升熵的分布均匀性
    hashed_str = hashlib.sha256(uuid_bytes).hexdigest()
    # 截取前10位作为最终ID
    return hashed_str[:10]
  • 优势:实现简单,碰撞概率极低,完全随机不可猜测
  • 注意:理论上仍存在极小碰撞概率,但在绝大多数业务场景下可忽略

方案2:时间戳+随机字符组合法

结合时间戳(保证同一毫秒内重复概率低)和随机字符(增加不可猜测性),既避免连续ID的可预测性,又降低纯随机的碰撞风险。

import time
import random
import string

def generate_unique_id():
    # 取当前毫秒级时间戳的后6位(保证时间维度的唯一性基础)
    timestamp_segment = str(int(time.time() * 1000))[-6:]
    # 生成4位随机字母数字组合(62^4=14776336种可能,进一步降低碰撞)
    random_segment = ''.join(random.choices(string.ascii_letters + string.digits, k=4))
    # 拼接为10位ID
    return timestamp_segment + random_segment
  • 优势:ID包含时间信息,便于后续排查;随机部分保证不可猜测;碰撞概率极低
  • 注意:如果同一毫秒内生成超过1477万条ID才可能碰撞,适合绝大多数业务场景

方案3:简化版雪花算法(Base62编码)

借鉴雪花算法的时间戳+机器标识+序列逻辑,通过Base62编码压缩为10位字符串,适合分布式场景下的全局唯一ID,同时不可猜测。

import time
import random

# Base62字符集,包含数字、大小写字母
BASE62_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def num_to_base62(num):
    if num == 0:
        return BASE62_CHARS[0]
    result = []
    while num > 0:
        num, remainder = divmod(num, 62)
        result.append(BASE62_CHARS[remainder])
    return ''.join(reversed(result))

def generate_snowflake_id():
    # 起始时间戳(2021-01-01 00:00:00 UTC),减少时间戳的位数
    start_timestamp = 1609459200
    # 当前时间戳(秒级)与起始时间的差值
    current_timestamp = int(time.time()) - start_timestamp
    # 模拟机器标识(分布式场景下可替换为实际机器/节点ID)
    machine_id = random.randint(0, 61)
    # 同一秒内的序列值(简化为随机数,生产环境可维护自增计数器)
    sequence = random.randint(0, 61)
    # 组合成唯一数字:时间戳占高位,机器标识和序列占低位
    combined_num = (current_timestamp << 12) | (machine_id << 6) | sequence
    # 转换为Base62字符串,补零到10位
    base62_id = num_to_base62(combined_num).zfill(10)
    # 确保最终ID为10位
    return base62_id[-10:]
  • 优势:分布式场景下全局唯一;包含时间维度,可追溯生成时间;不可猜测
  • 注意:生产环境中建议将序列改为自增计数器,避免同一秒内的碰撞风险

内容的提问来源于stack exchange,提问作者SHIVAM JINDAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:05:27