ฉันรวมคำตอบจากเปลือกตาและคิมคา
ต่อไปนี้เป็นบริการ angularjs และรองรับตัวเลขสตริงและวัตถุ
exports.Hash = () => {
let hashFunc;
function stringHash(string, noType) {
let hashString = string;
if (!noType) {
hashString = `string${string}`;
}
var hash = 0;
for (var i = 0; i < hashString.length; i++) {
var character = hashString.charCodeAt(i);
hash = ((hash<<5)-hash)+character;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
function objectHash(obj, exclude) {
if (exclude.indexOf(obj) > -1) {
return undefined;
}
let hash = '';
const keys = Object.keys(obj).sort();
for (let index = 0; index < keys.length; index += 1) {
const key = keys[index];
const keyHash = hashFunc(key);
const attrHash = hashFunc(obj[key], exclude);
exclude.push(obj[key]);
hash += stringHash(`object${keyHash}${attrHash}`, true);
}
return stringHash(hash, true);
}
function Hash(unkType, exclude) {
let ex = exclude;
if (ex === undefined) {
ex = [];
}
if (!isNaN(unkType) && typeof unkType !== 'string') {
return unkType;
}
switch (typeof unkType) {
case 'object':
return objectHash(unkType, ex);
default:
return stringHash(String(unkType));
}
}
hashFunc = Hash;
return Hash;
};
ตัวอย่างการใช้งาน:
Hash('hello world'), Hash('hello world') == Hash('hello world')
Hash({hello: 'hello world'}), Hash({hello: 'hello world'}) == Hash({hello: 'hello world'})
Hash({hello: 'hello world', goodbye: 'adios amigos'}), Hash({hello: 'hello world', goodbye: 'adios amigos'}) == Hash({goodbye: 'adios amigos', hello: 'hello world'})
Hash(['hello world']), Hash(['hello world']) == Hash(['hello world'])
Hash(1), Hash(1) == Hash(1)
Hash('1'), Hash('1') == Hash('1')
เอาท์พุต
432700947 true
-411117486 true
1725787021 true
-1585332251 true
1 true
-1881759168 true
คำอธิบาย
อย่างที่คุณเห็นหัวใจของการบริการคือฟังก์ชั่นแฮชที่สร้างขึ้นโดย KimKha.I ได้เพิ่มประเภทให้กับสตริงเพื่อที่โครงสร้างของวัตถุจะส่งผลกระทบต่อค่าแฮชสุดท้ายปุ่มถูกแฮชเพื่อป้องกันการชนกันของอาร์เรย์
การเปรียบเทียบวัตถุที่ไม่มีเปลือกตาใช้เพื่อป้องกันการเรียกซ้ำแบบไม่ จำกัด โดยวัตถุอ้างอิงตัวเอง
การใช้
ฉันสร้างบริการนี้เพื่อให้ฉันสามารถมีบริการข้อผิดพลาดที่เข้าถึงได้ด้วยวัตถุ เพื่อให้บริการหนึ่งสามารถลงทะเบียนข้อผิดพลาดกับวัตถุที่กำหนดและบริการอื่นสามารถตรวจสอบว่าพบข้อผิดพลาดใด ๆ
กล่าวคือ
JsonValidation.js
ErrorSvc({id: 1, json: '{attr: "not-valid"}'}, 'Invalid Json Syntax - key not double quoted');
UserOfData.js
ErrorSvc({id: 1, json: '{attr: "not-valid"}'});
สิ่งนี้จะกลับมา:
['Invalid Json Syntax - key not double quoted']
ในขณะที่
ErrorSvc({id: 1, json: '{"attr": "not-valid"}'});
สิ่งนี้จะกลับมา
[]