मैंने पलक और किमखा के जवाबों को मिला दिया।
निम्नलिखित कोणीयज सेवा है और यह संख्याओं, तारों और वस्तुओं का समर्थन करता है।
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 द्वारा बनाया गया हैश फ़ंक्शन है। मैंने स्ट्रिंग्स में प्रकार जोड़े हैं, ताकि ऑब्जेक्ट की स्ट्रेक्चर भी अंतिम हैश मान पर असर डाले। कुंजियाँ सरणी को रोकने के लिए हैश की गई हैं। ऑब्जेक्ट टकराव
पलकविहीनता वस्तु तुलना का उपयोग स्वयं संदर्भित वस्तुओं द्वारा शिशु पुनरावृत्ति को रोकने के लिए किया जाता है।
प्रयोग
मैंने इस सेवा को बनाया ताकि मैं एक त्रुटि सेवा प्राप्त कर सकूं जो वस्तुओं के साथ उपलब्ध है। ताकि एक सेवा किसी दिए गए ऑब्जेक्ट के साथ त्रुटि दर्ज कर सके और दूसरा यह निर्धारित कर सके कि क्या कोई त्रुटि पाई गई थी।
अर्थात
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"}'});
यह वापस आ जाएगी
[]