Göz kapaksızlığından ve KimKha'dan gelen cevapları birleştirdim.
Aşağıdaki bir açısaljs hizmetidir ve sayıları, dizeleri ve nesneleri destekler.
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;
};
Örnek Kullanım:
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')
Çıktı
432700947 true
-411117486 true
1725787021 true
-1585332251 true
1 true
-1881759168 true
açıklama
Gördüğünüz gibi hizmetin kalbi KimKha tarafından yaratılan hash işlevidir. Nesnenin yapısı da son karma değerini etkileyecek şekilde dizelere türler ekledim.
göz kapaksızlığı nesne karşılaştırması, kendi kendini referanslayan nesneler tarafından sonsuz özyinelemeyi önlemek için kullanılır.
kullanım
Bu hizmeti, nesnelerle erişilen bir hata hizmetine sahip olabilmem için oluşturdum. Böylece bir hizmet belirli bir nesneyle hata kaydedebilir ve diğeri herhangi bir hatanın bulunup bulunmadığını belirleyebilir.
yani
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"}'});
Bu geri dönecektir:
['Invalid Json Syntax - key not double quoted']
Süre
ErrorSvc({id: 1, json: '{"attr": "not-valid"}'});
Bu geri dönecekti
[]