情况:
一个 JSON 对象,包含约 3000 个元素的数组。每个元素都有格式
base64String.base64String.base64String.base64String....
大约 20-30 个 base64 字符串,用
.
分隔。
这些base64String包含很多信息。和价值观。值被汇总到 bigInt 中。然后将 bigInt 转换为字节以用于散列等等。
整个过程需要尽可能快,因为这只是整个处理链的一小部分,一切都需要很快。 bigInts 值限制为 64 位(Java Long)。
我测试了3个选项:
function bigIntToBigEndianBytesLoop(value) {
const hex = value.toString(16).padStart(8 * 2, '0');
const bytes = new Uint8Array(8);
for (let i = 0; i < 8; i++) {
bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
}
return bytes;
}
function bigIntToBigEndianBytesDataView(value) {
const buf = new ArrayBuffer(8);
const view = new DataView(buf);
view.setBigUint64(0, value);
return new Uint8Array(buf);
}
function bigIntToUint8ArrayDirect(num) {
const result = new Uint8Array(8);
result[7] = Number(num & 0xffn);
result[6] = Number((num >> 8n) & 0xffn);
result[5] = Number((num >> 16n) & 0xffn);
result[4] = Number((num >> 24n) & 0xffn);
result[3] = Number((num >> 32n) & 0xffn);
result[2] = Number((num >> 40n) & 0xffn);
result[1] = Number((num >> 48n) & 0xffn);
result[0] = Number((num >> 56n) & 0xffn);
return result;
}
到目前为止,直接方法似乎是最快的。 https://www.measurethat.net/Benchmarks/Show/33000/3/bigint-to-bigendian-bytes 还有其他方法可以使用吗?
您可以首先将 BigInt 拆分为两个数字(32 位),然后继续处理这两个数字:
// Direct Constructor with split
function bigIntToUint8ArrayDirectConstructor2(value) {
const result = new Uint8Array(8);
const low = Number(value & 0xffffffffn);
const high = Number((value >> 32n) & 0xffffffffn);
result[7] = low & 0xff;
result[6] = (low >> 8) & 0xff;
result[5] = (low >> 16) & 0xff;
result[4] = (low >> 24) & 0xff;
result[3] = high & 0xff;
result[2] = (high >> 8) & 0xff;
result[1] = (high >> 16) & 0xff;
result[0] = (high >> 24) & 0xff;
return result;
}
这就是我得到的: