나는 눈꺼풀과 김카의 대답을 결합했습니다.
다음은 angularjs 서비스이며 숫자, 문자열 및 객체를 지원합니다.
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"}'});
이것은 돌아올 것이다
[]