如何生成不存在于已有列表中的无重复16位随机数字
现有实现的问题
- 你当前的生成逻辑是将同一个4位随机数重复拼接4次,总共只有9000种可能的结果,重复概率极高,完全不适合作为数据库主键使用。
- 16位数字已经超过JavaScript普通
Number类型的最大安全整数(2^53-1 ≈ 9007199254740991),如果用Number类型存储会出现精度丢失,导致存入数据库的ID和生成值不一致,建议优先用字符串格式存储该主键。
实现方案
我们可以先把已有ID列表转成Set来实现O(1)复杂度的重复校验,再生成真正随机的16位数字串,循环校验直到拿到不重复的ID即可,完整代码如下:
// 已有ID列表,统一转成字符串避免精度问题 const nums = [7856328870763265, 0107654389657487]; const existIds = new Set(nums.map(id => id.toString())); // 生成16位随机数字串 function generateRandom16Num() { let res = ''; for (let i = 0; i < 16; i++) { res += Math.floor(Math.random() * 10); } return res; } // 生成不重复的16位ID function getUniqueId() { let id; do { id = generateRandom16Num(); } while(existIds.has(id)); // 新ID加入集合,避免后续重复生成 existIds.add(id); // 如果需要数字类型,可返回BigInt:return BigInt(id); return id; } // 测试 const newId = getUniqueId(); console.log(newId);
补充说明
如果你的小型项目总数据量不超过十万级,该方案完全够用,16位纯随机数的碰撞概率极低,加上实时去重校验不会出现重复主键问题。
内容的提问来源于stack exchange,提问作者user15570950
相关产品推荐
相关产品推荐

