add hash-sum
This commit is contained in:
parent
9b72c5c58d
commit
4c8ad76035
|
|
@ -0,0 +1,71 @@
|
||||||
|
function pad(hash: string, len: number): string {
|
||||||
|
while (hash.length < len) {
|
||||||
|
hash = "0" + hash;
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fold(hash: number, text: string): number {
|
||||||
|
let i: number;
|
||||||
|
let chr: number;
|
||||||
|
let len: number;
|
||||||
|
if (text.length === 0) {
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
for (i = 0, len = text.length; i < len; i++) {
|
||||||
|
chr = text.charCodeAt(i);
|
||||||
|
hash = (hash << 5) - hash + chr;
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
return hash < 0 ? hash * -2 : hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
function foldObject(hash: number, o: any, seen: any[]): number {
|
||||||
|
return Object.keys(o).sort().reduce(foldKey, hash);
|
||||||
|
function foldKey(hash: number, key: string): number {
|
||||||
|
return foldValue(hash, o[key], key, seen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function foldValue(
|
||||||
|
input: number,
|
||||||
|
value: any,
|
||||||
|
key: string,
|
||||||
|
seen: any[]
|
||||||
|
): number {
|
||||||
|
let hash = fold(fold(fold(input, key), toString(value)), typeof value);
|
||||||
|
if (value === null) {
|
||||||
|
return fold(hash, "null");
|
||||||
|
}
|
||||||
|
if (value === undefined) {
|
||||||
|
return fold(hash, "undefined");
|
||||||
|
}
|
||||||
|
if (typeof value === "object" || typeof value === "function") {
|
||||||
|
if (seen.indexOf(value) !== -1) {
|
||||||
|
return fold(hash, "[Circular]" + key);
|
||||||
|
}
|
||||||
|
seen.push(value);
|
||||||
|
|
||||||
|
const objHash = foldObject(hash, value, seen);
|
||||||
|
|
||||||
|
if (!("valueOf" in value) || typeof value.valueOf !== "function") {
|
||||||
|
return objHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return fold(objHash, String(value.valueOf()));
|
||||||
|
} catch (err: any) {
|
||||||
|
return fold(objHash, "[valueOf exception]" + (err.stack || err.message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fold(hash, value.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
function toString(o: any): string {
|
||||||
|
return Object.prototype.toString.call(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hashSum(o: any): string {
|
||||||
|
return pad(foldValue(0, o, "", []).toString(16), 8);
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue