生成20位数字间隔的唯一且可逆的id

Generate unique and reversible id for 20 digits interval

本文关键字:id 唯一 生成 数字 20位      更新时间:2023-09-26

我想从表示数字的字符串中生成一个新的唯一20位字符串

例如:

 var uid = key.pseudoHash("00000000000000000000"), // "45021-78054-45021-16875"
     uid = key.pseudoHash("00000000000000000001"), // "15751-40213-97315-65348"
     ..
     uid = key.pseudoHash("99999999999999999999"); // "01197-95791-58880-58368"

我怎么能有这样一个伪散列函数,它不会发生冲突,并且可以反转?

多种方法中的一种是使用简单的替换密码:

// guaranteed random!
var key = [1, 3, 3, 1, 8, 3, 5, 7, 2, 9, 0, 2, 8, 2, 9, 7, 7, 8, 1, 7];
function test(str) {
  str = str.split("");
  for(var i = 0; i < str.length; i++) {
      str[i] = (Number(str[i]) + key[i]) % 10
  }
  return str.join("");
}
console.log(test("00000000000000000000")); // 13318357290282977817
console.log(test("00000000000000000001")); // 13318357290282977818
console.log(test("99999999999999999999")); // 02207246189171866706

为了获得更多的随机性,可以添加更多的混淆和扩散步骤。

任何人都可以轻易扭转这种局面。对于安全算法,请研究密码学。

不要实现它,因为它使用了JS的shonky‘modulus’运算符(我在C#中的单元测试中发现了一个错误(:

var key = [1, 3, 3, 1, 8, 3, 5, 7, 2, 9, 0, 2, 8, 2, 9, 7, 7, 8, 1, 7];
function test(str) {
  str = str.split("");
  for(var i = 0; i < str.length; i++) {
      str[i] = (Number(str[i]) + key[i]) % 10
  }
  return str.join("");
}
function untest(str) {
  str = str.split("");
  for(var i = 0; i < str.length; i++) {
      str[i] = (Number(str[i]) - key[i]) % 10
  }
  return str.join("");
}
document.write(test("1000000001")); // 2331835720
document.write("<br></br>");
document.write(untest("2331835720")); // oh dear this doesn't round-trip: actually returns 100000000-9 and not 1000000001
document.write("<br></br>");
document.write( -9 % 10 );
document.write("<br></br>");

您可以通过用模数函数替换%10来避免这种情况(根据下面的C#代码段(:

static private int Mod(int x, int m)
{            
    return (x % m + m) % m;
}