Tôi đã kết hợp các câu trả lời từ mí mắt và KimKha.
Sau đây là dịch vụ angularjs và nó hỗ trợ số, chuỗi và đối tượng.
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;
};
Cách sử dụng ví dụ:
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')
Đầu ra
432700947 true
-411117486 true
1725787021 true
-1585332251 true
1 true
-1881759168 true
Giải trình
Như bạn có thể thấy trung tâm của dịch vụ là hàm băm do KimKha tạo ra. Tôi đã thêm các loại vào chuỗi để cấu trúc của đối tượng cũng sẽ tác động đến giá trị băm cuối cùng. Các khóa được băm để ngăn va chạm mảng | đối tượng.
so sánh đối tượng mí mắt được sử dụng để ngăn ngừa đệ quy vô hạn bằng cách tự tham chiếu các đối tượng.
Sử dụng
Tôi đã tạo dịch vụ này để tôi có thể có một dịch vụ lỗi được truy cập với các đối tượng. Vì vậy, một dịch vụ có thể đăng ký lỗi với một đối tượng nhất định và dịch vụ khác có thể xác định xem có lỗi nào được tìm thấy không.
I E
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"}'});
Điều này sẽ trở lại:
['Invalid Json Syntax - key not double quoted']
Trong khi
ErrorSvc({id: 1, json: '{"attr": "not-valid"}'});
Điều này sẽ trở lại
[]