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

如何生成不存在于已有列表中的无重复16位随机数字

现有实现的问题

  1. 你当前的生成逻辑是将同一个4位随机数重复拼接4次,总共只有9000种可能的结果,重复概率极高,完全不适合作为数据库主键使用。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:45:02