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

Javascript 生成20位数间隔的唯一可逆id,javascript,node.js,algorithm,math,Javascript,Node.js,Algorithm,Math,我想从表示数字的字符串生成一个新的唯一20位字符串 例如: var uid = key.pseudoHash("00000000000000000000"), // "45021-78054-45021-16875" uid = key.pseudoHash("00000000000000000001"), // "15751-40213-97315-65348" .. uid = key.pseudoHash("99999999999999999999"); /

我想从表示数字的字符串生成一个新的唯一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"

如何使这个伪散列函数不发生冲突并且可以反转?

许多方法中的一种方法是使用一个简单的:

//保证随机!
var key=[1,3,3,1,8,3,5,7,2,9,0,2,8,2,9,7,7,8,1,7];
功能测试(str){
str=str.split(“”);
对于(变量i=0;i
要获得更多随机性,可以添加更多步骤


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

不要实现这一点,因为它使用了JS的shonky'module'运算符(我在C#中的单元测试中发现了一个bug):


identity函数有什么问题?你能说得更具体一点吗?你为什么不使用字符串本身作为IDF来进行简单的模糊处理呢?你用
CryptoJS
尝试过了吗?谢谢你的回答,我在看密码。这个方法是否没有冲突?我是否必须使用同一个键来反转过程?@sklts是的,没有冲突。该方法可以通过减去键来反转(即,将第6行的
+
更改为
-
// 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
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>");
static private int Mod(int x, int m)
{            
    return (x % m + m) % m;
}