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

如何生成固定长度、唯一且不可人工预测的纯数字ID?

解决方案:基于线性同余双射变换的不可预测纯数字ID生成

核心思路

利用线性同余双射变换实现无存储、唯一且不可预测的N位纯数字ID生成。通过秘密的乘数和加数参数,对输入的索引值进行模运算变换,确保每个输入对应唯一输出,且第三方无法通过输出序列预测规律。

关键原理

对于模m=10^N(N为ID位数,最大10),构造双射函数:
f(x) = (a*x + b) mod m
要保证双射(唯一映射),需满足:

  • 乘数a与m互质(即a不能被2或5整除)
  • 加数b为任意秘密整数

为满足ID必须是正整数的要求,将变换结果为0的情况映射为10^N(例如N=1时,0映射为10)。

JavaScript实现代码

class UnpredictableIDGenerator {
  constructor(N) {
    if (N < 1 || N > 10) {
      throw new Error('N必须在1到10之间');
    }
    this.N = N;
    this.m = 10 ** N;
    // 自定义秘密参数,可替换为随机生成的符合条件的值
    this.a = 9999999967; // 大质数,与10^N互质(不被2、5整除)
    this.b = 123456789; // 任意秘密值,可根据需求修改
    // 验证参数合法性,确保双射
    if (this.gcd(this.a, this.m) !== 1) {
      throw new Error('乘数a必须与10^N互质');
    }
  }

  // 计算最大公约数,用于验证参数
  gcd(a, b) {
    while (b !== 0) {
      [a, b] = [b, a % b];
    }
    return a;
  }

  generateID(input) {
    const maxInput = this.m - 1;
    if (input < 0 || input > maxInput) {
      throw new Error(`输入必须在0到${maxInput}之间`);
    }
    // 使用BigInt避免大数溢出(N=10时10^10是100亿,JS Number可处理,但乘法可能溢出)
    const result = (BigInt(this.a) * BigInt(input) + BigInt(this.b)) % BigInt(this.m);
    // 确保输出为正整数,将0映射为10^N
    return result === 0n ? Number(this.m) : Number(result);
  }
}

// 示例使用
const generator = new UnpredictableIDGenerator(1);
console.log(generator.generateID(0)); // 输出示例:3(具体值取决于参数)
console.log(generator.generateID(9)); // 输出示例:2(具体值取决于参数)

方案优势

  • 无存储开销:无需预生成或存储映射关系,所有计算实时完成,内存占用O(1)
  • 绝对唯一:双射变换保证每个输入对应唯一输出,遍历所有输入不会出现重复ID
  • 不可预测:秘密参数a和b不对外暴露,第三方无法通过输出序列推导输入规律或预测下一个ID
  • 灵活适配:支持1-10位ID生成,只需修改构造函数的N参数
  • 高性能:运算逻辑简单,适合高并发场景

补充说明

  1. 参数自定义:可以随机生成a和b,只要a与10^N互质即可。生成随机a时,可循环生成随机数并检查gcd(a, 10^N) === 1
  2. 可逆性:如果需要根据输出ID反推输入索引,可计算a的模逆元(因a与m互质,逆元必然存在),公式为:x = ((output - b) * a_inv) mod m(若output为10^N,视为0)
  3. 大数处理:当N≥10时,使用BigInt避免JavaScript Number的精度溢出问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:55