如何基于字符串和种子生成64位数字格式的非加密哈希?
解决方案
要生成64位纯数字格式的非加密(或加密)哈希,你需要解决两个核心问题:处理哈希输出的格式转换,以及避免JavaScript中数字精度丢失的问题,具体实现如下:
方法一:基于CryptoJS.HmacSHA512生成64位数字哈希
CryptoJS.HmacSHA512返回的是WordArray类型,需要先转换为十六进制字符串,再截取对应64位二进制的片段,最后用BigInt转换为纯数字字符串(避免精度丢失):
const seed = 123456; const name = "你的目标字符串"; // 生成HMAC-SHA512哈希的WordArray对象 const hashWordArray = CryptoJS.HmacSHA512(name, seed.toString()); // 转换为十六进制字符串 const hexFullHash = hashWordArray.toString(CryptoJS.enc.Hex); // 截取前16位十六进制字符(对应64位二进制哈希) const hex64Bit = hexFullHash.substring(0, 16); // 用BigInt将十六进制转为64位整数 const bigIntHash = BigInt(`0x${hex64Bit}`); // 转换为纯数字字符串 const numericHash = bigIntHash.toString(); console.log(numericHash); // 输出类似"1234567890123456789"的64位数字字符串
方法二:用64位版本的MurmurHash生成非加密哈希
如果不需要加密级别的安全性,推荐直接使用64位版本的MurmurHash,性能更优且原生支持64位输出:
// 需先安装murmurhash3js库:npm install murmurhash3js const murmurhash = require('murmurhash3js'); const seed = 123456; const name = "你的目标字符串"; // 生成128位MurmurHash3哈希,取前64位组合成BigInt const [high32, low32] = murmurhash.x64.hash128(name, seed); const bigIntHash = (BigInt(high32) << 32n) | BigInt(low32); const numericHash = bigIntHash.toString(); console.log(numericHash);
关键注意事项
- 必须用BigInt:64位无符号整数的最大值为
18446744073709551615,远超JavaScriptNumber类型的安全范围(9007199254740991),使用BigInt才能避免精度丢失。 - 若需要固定长度的数字字符串,可以在转换后补前导零(例如使用
numericHash.padStart(19, '0')确保19位长度)。
内容的提问来源于stack exchange,提问作者Naomi
相关产品推荐
相关产品推荐

