104 lines
3.6 KiB
JavaScript
104 lines
3.6 KiB
JavaScript
"use strict";
|
|
var __values = (this && this.__values) || function(o) {
|
|
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
if (m) return m.call(o);
|
|
if (o && typeof o.length === "number") return {
|
|
next: function () {
|
|
if (o && i >= o.length) o = void 0;
|
|
return { value: o && o[i++], done: !o };
|
|
}
|
|
};
|
|
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.hash = void 0;
|
|
var uid_1 = require("./uid");
|
|
/**
|
|
* Hash function.
|
|
*
|
|
* @param itemList The items to be hashed.
|
|
* @return The hash code.
|
|
*/
|
|
function hash() {
|
|
var e_1, _a;
|
|
var itemList = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
itemList[_i] = arguments[_i];
|
|
}
|
|
var ret = INIT_VALUE;
|
|
try {
|
|
for (var itemList_1 = __values(itemList), itemList_1_1 = itemList_1.next(); !itemList_1_1.done; itemList_1_1 = itemList_1.next()) {
|
|
var item = itemList_1_1.value;
|
|
item = item ? item.valueOf() : item;
|
|
var type = typeof item;
|
|
if (type === "boolean")
|
|
// BOOLEAN -> 1 BYTE
|
|
ret = _Hash_boolean(item, ret);
|
|
else if (type === "number" || type === "bigint")
|
|
// NUMBER -> 8 BYTES
|
|
ret = _Hash_number(item, ret);
|
|
else if (type === "string")
|
|
// STRING -> {LENGTH} BYTES
|
|
ret = _Hash_string(item, ret);
|
|
else if (item instanceof Object &&
|
|
item.hashCode instanceof Function) {
|
|
var hashed = item.hashCode();
|
|
if (itemList.length === 1)
|
|
return hashed;
|
|
else {
|
|
ret = ret ^ hashed;
|
|
ret *= MULTIPLIER;
|
|
}
|
|
} // object | null | undefined
|
|
else
|
|
ret = _Hash_number((0, uid_1.get_uid)(item), ret);
|
|
}
|
|
}
|
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
finally {
|
|
try {
|
|
if (itemList_1_1 && !itemList_1_1.done && (_a = itemList_1.return)) _a.call(itemList_1);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
}
|
|
return Math.abs(ret);
|
|
}
|
|
exports.hash = hash;
|
|
function _Hash_boolean(val, ret) {
|
|
ret ^= val ? 1 : 0;
|
|
ret *= MULTIPLIER;
|
|
return ret;
|
|
}
|
|
function _Hash_number(val, ret) {
|
|
return _Hash_string(val.toString(), ret);
|
|
// // ------------------------------------------
|
|
// // IN C++
|
|
// // CONSIDER A NUMBER AS A STRING
|
|
// // HASH<STRING>((CHAR*)&VAL, 8)
|
|
// // ------------------------------------------
|
|
// // CONSTRUCT BUFFER AND BYTE_ARRAY
|
|
// const buffer: ArrayBuffer = new ArrayBuffer(8);
|
|
// const byteArray: Int8Array = new Int8Array(buffer);
|
|
// const valueArray: Float64Array = new Float64Array(buffer);
|
|
// valueArray[0] = val;
|
|
// for (let i: number = 0; i < byteArray.length; ++i)
|
|
// {
|
|
// const byte = (byteArray[i] < 0) ? byteArray[i] + 256 : byteArray[i];
|
|
// ret ^= byte;
|
|
// ret *= _HASH_MULTIPLIER;
|
|
// }
|
|
// return Math.abs(ret);
|
|
}
|
|
function _Hash_string(str, ret) {
|
|
for (var i = 0; i < str.length; ++i) {
|
|
ret ^= str.charCodeAt(i);
|
|
ret *= MULTIPLIER;
|
|
}
|
|
return Math.abs(ret);
|
|
}
|
|
/* ---------------------------------------------------------
|
|
RESERVED ITEMS
|
|
--------------------------------------------------------- */
|
|
var INIT_VALUE = 2166136261;
|
|
var MULTIPLIER = 16777619;
|
|
//# sourceMappingURL=hash.js.map
|