@lobehub/tts
Version:
A high-quality & reliable TTS React Hooks library
70 lines (69 loc) • 2.94 kB
JavaScript
//#region src/core/utils/getSHA256.ts
const uint8Array = Uint8Array;
const uint32Array = Uint32Array;
const pow = Math.pow;
const DEFAULT_STATE = new uint32Array(8);
const ROUND_CONSTANTS = [];
const LittleEndian = !!new uint8Array(new uint32Array([1]).buffer)[0];
const encoder = new TextEncoder();
function convertEndian(word) {
return LittleEndian ? word >>> 24 | (word >>> 16 & 255) << 8 | (word & 65280) << 8 | word << 24 : word;
}
function rightRotate(word, bits) {
return word >>> bits | word << 32 - bits;
}
function sha256(data) {
const STATE = [...DEFAULT_STATE];
const legth = data.length;
const bitLength = legth * 8;
const newBitLength = 512 - (bitLength + 64) % 512 - 1 + bitLength + 65;
const bytes = new uint8Array(newBitLength / 8);
const words = new uint32Array(bytes.buffer);
bytes.set(data, 0);
bytes[legth] = 128;
words[words.length - 1] = convertEndian(bitLength);
const M = new uint32Array(64);
for (let block = 0; block < newBitLength / 32; block += 16) {
const workingState = [...STATE];
for (let round = 0; round < 64; round++) {
let MRound;
if (round < 16) MRound = convertEndian(words[block + round]);
else {
const gamma0x = M[round - 15];
const gamma1x = M[round - 2];
MRound = M[round - 7] + M[round - 16] + (rightRotate(gamma0x, 7) ^ rightRotate(gamma0x, 18) ^ gamma0x >>> 3) + (rightRotate(gamma1x, 17) ^ rightRotate(gamma1x, 19) ^ gamma1x >>> 10);
}
M[round] = MRound = Math.trunc(MRound);
const t1 = (rightRotate(workingState[4], 6) ^ rightRotate(workingState[4], 11) ^ rightRotate(workingState[4], 25)) + (workingState[4] & workingState[5] ^ ~workingState[4] & workingState[6]) + workingState[7] + MRound + ROUND_CONSTANTS[round];
const t2 = (rightRotate(workingState[0], 2) ^ rightRotate(workingState[0], 13) ^ rightRotate(workingState[0], 22)) + (workingState[0] & workingState[1] ^ workingState[2] & (workingState[0] ^ workingState[1]));
for (let i = 7; i > 0; i--) workingState[i] = workingState[i - 1];
workingState[0] = Math.trunc(t1 + t2);
workingState[4] = Math.trunc(workingState[4] + t1);
}
for (let round = 0; round < 8; round++) STATE[round] = Math.trunc(STATE[round] + workingState[round]);
}
return new uint8Array(new uint32Array(STATE.map(convertEndian)).buffer);
}
function hex(bin) {
return [...bin].map((val) => ("00" + val.toString(16)).slice(-2)).join("");
}
function hash(str) {
return hex(sha256(encoder.encode(str)));
}
(function initialize() {
let n = 2;
let nPrime = 0;
while (nPrime < 64) {
let isPrime = true;
for (let factor = 2; factor <= n / 2; factor++) if (n % factor === 0) isPrime = false;
if (isPrime) {
const getFractionalBits = (n) => Math.trunc((n - Math.trunc(n)) * pow(2, 32));
if (nPrime < 8) DEFAULT_STATE[nPrime] = getFractionalBits(pow(n, 1 / 2));
ROUND_CONSTANTS[nPrime] = getFractionalBits(pow(n, 1 / 3));
nPrime++;
}
n++;
}
})();
//#endregion
export { hash };