J'ai combiné les réponses de la paupière et de KimKha.
Ce qui suit est un service angularjs et il prend en charge les nombres, les chaînes et les objets.
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;
};
Exemple d'utilisation:
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')
Production
432700947 true
-411117486 true
1725787021 true
-1585332251 true
1 true
-1881759168 true
Explication
Comme vous pouvez le voir, le cœur du service est la fonction de hachage créée par KimKha, j'ai ajouté des types aux chaînes afin que la structure de l'objet ait également un impact sur la valeur de hachage finale.Les clés sont hachées pour éviter les collisions tableau | objet.
La comparaison d'objets sans paupière est utilisée pour empêcher la récursivité infinie par les objets auto-référençables.
Usage
J'ai créé ce service pour pouvoir disposer d'un service d'erreur accessible avec des objets. Pour qu'un service puisse enregistrer une erreur avec un objet donné et qu'un autre puisse déterminer si des erreurs ont été trouvées.
c'est à dire
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"}'});
Cela reviendrait:
['Invalid Json Syntax - key not double quoted']
Tandis que
ErrorSvc({id: 1, json: '{"attr": "not-valid"}'});
Cela reviendrait
[]