为什么当我更改对象的数据时,对象的散列值保持不变?
Why is the hash of an object staying the same when I change its data?
我有这段代码可以对对象进行哈希处理。
我将这个散列保存为 redis 中的一个超时键,但即使我更改了传入请求对象中的某些内容,它也会生成相同的散列并且 redis 显示那里已经有相同的键。
这个包在散列方面有问题还是我的代码有问题?
const asyncMiddleware = require('../middlewares/async');
var CryptoJS = require("crypto-js");
exports.hash = asyncMiddleware(async (hashRequest) => {
try {
var hash = CryptoJS.SHA256(hashRequest).toString(CryptoJS.enc.Base64);
return hash;
} catch (error) {
console.log("Error : ", error);
}
});
您不能将对象传递给 SHA256 方法,您只能传递字符串和 WordArrays。
当你传递一个对象时,cryptojs 将在其上 运行 .toString()
,这将始终给出相同的输出 ([object Object]
),因此具有相同的哈希值。
console.log(({a:1,b:1}).toString())
console.log(({a:1,b:2}).toString())
如果你想散列对象,JSON.stringify()
它们:
const asyncMiddleware = require('../middlewares/async');
var CryptoJS = require("crypto-js");
exports.hash = asyncMiddleware(async (hashRequest) => {
try {
return CryptoJS.SHA256(JSON.stringify(hashRequest)).toString(CryptoJS.enc.Base64);
} catch (error) {
console.log("Error : ", error);
}
});
再次查看我的 repl,以了解差异。
我有这段代码可以对对象进行哈希处理。
我将这个散列保存为 redis 中的一个超时键,但即使我更改了传入请求对象中的某些内容,它也会生成相同的散列并且 redis 显示那里已经有相同的键。
这个包在散列方面有问题还是我的代码有问题?
const asyncMiddleware = require('../middlewares/async');
var CryptoJS = require("crypto-js");
exports.hash = asyncMiddleware(async (hashRequest) => {
try {
var hash = CryptoJS.SHA256(hashRequest).toString(CryptoJS.enc.Base64);
return hash;
} catch (error) {
console.log("Error : ", error);
}
});
您不能将对象传递给 SHA256 方法,您只能传递字符串和 WordArrays。
当你传递一个对象时,cryptojs 将在其上 运行 .toString()
,这将始终给出相同的输出 ([object Object]
),因此具有相同的哈希值。
console.log(({a:1,b:1}).toString())
console.log(({a:1,b:2}).toString())
如果你想散列对象,JSON.stringify()
它们:
const asyncMiddleware = require('../middlewares/async');
var CryptoJS = require("crypto-js");
exports.hash = asyncMiddleware(async (hashRequest) => {
try {
return CryptoJS.SHA256(JSON.stringify(hashRequest)).toString(CryptoJS.enc.Base64);
} catch (error) {
console.log("Error : ", error);
}
});
再次查看我的 repl,以了解差异。