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

仅使用10位小写字母数字字符能否生成无碰撞随机字符串?

10位全小写字母数字无碰撞字符串生成方案

首先给明确结论:纯随机生成不可能做到100%无碰撞,但通过工程化方案完全可以实现全小写字符集下的无碰撞生成,不需要像Bitly那样混用大小写扩大字符集。

先算基础容量:全小写字母(26个)+数字(10个)合计36个可用字符,10位长度的总组合数为36^10 ≈ 3656万亿,这个容量足够覆盖绝大多数业务场景的需求。

纯随机方案的碰撞风险可以参考生日悖论计算:当你纯随机生成约850万个串时,碰撞概率就已经达到1%;生成到7000万个串时,碰撞概率会升到50%,生成量越大碰撞概率越趋近于100%,不存在靠随机算法本身规避碰撞的可能。

可落地的无碰撞实现方案

  • 自增ID转Base36编码(最稳妥零成本方案)
    维护一个全局自增的整数发号器,从1开始逐次递增,每次需要生成串时,拿到当前的自增ID直接转成36进制(用0-9对应数字值,a-z对应10-35的数值),长度不足10位时在前面补0凑够10位即可。
    这个方案是绝对零碰撞的,因为每个ID唯一,转码规则固定,生成的串必然唯一,不需要任何查重逻辑,生成性能极高,满容量可支撑3656万亿个不重复串。
  • 随机生成+唯一索引校验(适合需要随机外观的场景)
    如果不想要顺序感太强的串,可以每次用随机函数生成10位符合字符集要求的串,之后去存储层(数据库、Redis等)校验该串是否已经被分配:
    • 未被分配:直接写入存储并返回,同时给串字段加全局唯一索引,避免并发场景下的重复写入
    • 已被分配:重新生成随机串再次校验,直到拿到未使用的串
      在总生成量不超过100亿的情况下(不到总容量的百万分之三),单次生成撞库的概率极低,性能损耗几乎可以忽略。
  • 置换加密发号(兼顾随机性与高性能)
    如果既想要完全随机的外观,又不想承担查重的性能开销,可以用双射置换算法(比如适配数值范围的Feistel分组加密)对自增ID做置换,再将置换后的数值转成10位Base36串。因为置换算法是一一对应的,只要输入ID不重复,输出的串就绝对不会重复,不需要查重,生成性能和纯自增转码一致,输出的串没有顺序规律、看起来和纯随机生成的没有区别。

Bitly的短链方案本质也不是纯随机生成,核心还是发号逻辑,只是用了大小写+数字共62个字符的Base62编码扩大了单字符容量,对外呈现出随机串的效果,核心去重逻辑和上面的方案没有本质区别。

内容的提问来源于stack exchange,提问作者Jae Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:42:09