如何基于唯一整数生成唯一的类随机短Slug?
基于自增整数生成唯一类随机短Slug的方案
你需要把自增ID转成10字符以内、由小写字母和数字组成的类随机唯一Slug,核心是通过可逆映射+混淆实现,下面是几种实用方案:
一、混淆进制转换(推荐,支持可逆)
这是最常用的方案,既能保证唯一性,又能让Slug看起来无规律,还能从Slug反推回原始ID:
- 自定义字符映射表:把
a-z0-9这36个字符打乱顺序,生成一个固定的映射表,比如chars = 'x8p2k7m0r5t3b6v9g1d4s8zq...'(只要是36个不重复的目标字符就行)。别用默认的a=0、b=1顺序,否则Slug会有明显递增规律。 - ID混淆变换:对原始ID做个可逆的数学处理,比如异或一个固定的大整数(比如
0x5F3759DF),或者用线性同余公式new_id = (id * 1664525 + 1013904223) % 2^32(保证每个ID对应唯一的new_id)。这一步是为了打破自增ID的顺序感。 - 转36进制并映射:把混淆后的数值转成36进制,再用第一步的自定义字符表替换每一位的数值,得到最终Slug。
举个简单例子:
- 自定义字符表:
'qwe23rty45uiop67asdf89ghjklzxcvbnm01' - 原始ID=1,异或
0x12345678得到0x12345679,转36进制是1e5t8s,再用字符表替换后得到对应的Slug。
这种方案的长度非常可控:36^7就能覆盖780亿以内的ID,7个字符足够,远小于10字符的限制。
二、哈希截断(无需可逆,需处理冲突)
如果不需要从Slug反查ID,直接用哈希算法更简单:
- 对原始ID做哈希(比如MD5、SHA-1),取哈希值的前N位(比如前10位)。
- 把哈希的十六进制结果直接转成小写(本身就是a-f0-9,符合字符集要求),或者转成36进制进一步缩短长度。
注意:哈希存在极小的冲突概率,如果要求绝对唯一,生成后要检查数据库是否已有相同Slug,若冲突就换哈希的其他部分(比如取后10位)或者加个小后缀。
三、预生成随机映射表(适合ID范围可控的场景)
如果你的业务ID不会超过某个固定值(比如100万),可以提前生成一批唯一的随机Slug:
- 生成足够多的10字符以内的随机[a-z0-9]字符串,确保没有重复。
- 把这些Slug和自增ID一一绑定,存储在数据库的单独字段里,或者用一个映射表关联。
- 新实体创建时,直接取对应ID的预生成Slug即可。
这种方案的Slug完全随机,但需要提前规划和管理映射表,适合小范围ID的场景。
额外注意点
- 可逆性需求:如果需要从Slug反查原始ID,只能用第一种方案,后两种需要额外存储映射关系。
- 长度计算:36进制下,n位能覆盖的最大ID是
36^n - 1,比如5位能覆盖6000万以内的ID,完全满足绝大多数业务需求。
内容的提问来源于stack exchange,提问作者Jez
相关产品推荐
相关产品推荐

