有没有办法采用一个 256 个字符的唯一字符串,使用 JS 将其大小减小到 50± 个字符的唯一字符串,并保留保证的唯一性?



我正在为一个文本文件构建一个解析器,以构建到JSON对象中。

假设我在这行的某个地方有一个字符串,它是一个唯一的值:4E183437F3FAEBC107C333CD16657661598A2A523867A4A95F6DAD4D25E191722AFFB3FFE29E287D9EB21ED8035E7666D06E65EC064D5D4B337C034459BA7CD6F72437B439329B45F15D57176122965728B36DBB455D335AA904106A29B64694507B6A0F89FBF4A166BB3BBB4DDDC1674A1DB3B7D0FD332117877C4CE56465D8

我想在某种程度上使用这个唯一标识符作为key,但它太长了,不适合我的口味。

我想知道是否有一种方法可以创建一个较小的"哈希":

  1. 但不丢失和信息
  2. 保证唯一性
  3. 被转换回原来的

一些库/插件?

您可以创建一个长度较小的字符串,方法是将16位十六进制字符串转换为数字(使用BigInt(,然后创建一个以10000为底的新字符串,使字符代码为C的字符表示数字'C'.charCodeAt()

然后通过反向执行相同的过程将其转换回原始字符串。

字符串长度更短,并且您已经保存了一些位,但它仍然很长:

const encode = (input) => {
let n = 0n;
[...input].forEach((char, i) => {
const code = char.charCodeAt();
const value = BigInt(code <= 57 ? code - 48 : code - 55);
n += value * (16n ** BigInt(i));
});
const base10Str = String(n);
let output = '';
for (let i = 0; i < base10Str.length; i += 4) {
output += String.fromCharCode(base10Str.slice(i, i + 4));
}
return output;
};
const decode = (encoded) => {
let base10Str = '';
[...encoded].forEach((char) => {
base10Str += String(char.charCodeAt()).padStart(4, '0'); // todo: final char may need no padding
});
let n = BigInt(base10Str);
let inputStr = '';
for (let i = 255; i >= 0; i--) {
const thisHexMult = 16n ** BigInt(i);
const thisHexDigitBigInt = n / thisHexMult; // This will automatically effectively call Math.floor
n = n % thisHexMult;
const thisHexDigit = Number(thisHexDigitBigInt);
const charCode = thisHexDigit <= 9 ? thisHexDigit + 48 : thisHexDigit + 55;
inputStr = String.fromCharCode(charCode) + inputStr;
}
console.log(inputStr);
};
const encoded = encode('4E183437F3FAEBC107C333CD16657661598A2A523867A4A95F6DAD4D25E191722AFFB3FFE29E287D9EB21ED8035E7666D06E65EC064D5D4B337C034459BA7CD6F72437B439329B45F15D57176122965728B36DBB455D335AA904106A29B64694507B6A0F89FBF4A166BB3BBB4DDDC1674A1DB3B7D0FD332117877C4CE56465D8');
console.log('Encoded length:', encoded.length);
console.log(encoded);
decode(encoded);

最新更新