Połączyłem odpowiedzi z bez powiek i KimKha.
Poniżej znajduje się usługa angularjs, która obsługuje liczby, ciągi znaków i obiekty.
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;
};
Przykładowe zastosowanie:
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')
Wynik
432700947 true
-411117486 true
1725787021 true
-1585332251 true
1 true
-1881759168 true
Wyjaśnienie
Jak widać, sercem usługi jest funkcja skrótu stworzona przez KimKha. Dodałem typy do łańcuchów, aby struktura obiektu również wpłynęła na ostateczną wartość skrótu. Klucze są haszowane, aby zapobiec kolizjom tablic | obiektów.
Porównywanie obiektów bez powiek służy do zapobiegania nieskończonej rekurencji przez obiekty odnoszące się do siebie.
Stosowanie
Utworzyłem tę usługę, aby mieć usługę błędów, do której można uzyskać dostęp za pomocą obiektów. Aby jedna usługa mogła zarejestrować błąd w danym obiekcie, a inna mogła określić, czy znaleziono jakieś błędy.
to znaczy
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"}'});
To zwróci:
['Invalid Json Syntax - key not double quoted']
Podczas
ErrorSvc({id: 1, json: '{"attr": "not-valid"}'});
To wróci
[]