Saya menggabungkan jawaban dari kelopak mata dan KimKha.
Berikut ini adalah layanan angular dan mendukung angka, string, dan objek.
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;
};
Contoh penggunaan:
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')
Keluaran
432700947 true
-411117486 true
1725787021 true
-1585332251 true
1 true
-1881759168 true
Penjelasan
Seperti yang Anda lihat, inti dari layanan ini adalah fungsi hash yang dibuat oleh KimKha. Saya telah menambahkan tipe ke string sehingga struktur dari objek juga akan memengaruhi nilai hash akhir. Kunci hash untuk mencegah tumbukan array | objek benturan.
perbandingan objek kelopak mata digunakan untuk mencegah rekursi infinit dengan objek referensi diri.
Pemakaian
Saya membuat layanan ini sehingga saya bisa memiliki layanan kesalahan yang diakses dengan objek. Sehingga satu layanan dapat mendaftarkan kesalahan dengan objek yang diberikan dan yang lain dapat menentukan apakah ada kesalahan ditemukan.
yaitu
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"}'});
Ini akan mengembalikan:
['Invalid Json Syntax - key not double quoted']
Sementara
ErrorSvc({id: 1, json: '{"attr": "not-valid"}'});
Ini akan kembali
[]