【问题标题】:Hash/encrypt an array of objects散列/加密对象数组
【发布时间】:2020-07-08 22:42:25
【问题描述】:

如 SHA-256 一样,如何从对象数组创建散列?我尝试了几种方法,但无法使它们起作用。

我想通过比较之前和之后的哈希来检查数据是否发生了变化。

let data = [
  {foo: "foo", bar: "bar", baz: "baz"},
  {foo: "foo", bar: "bar", baz: "baz"},
  {foo: "foo", bar: "bar", baz: "baz"},
];

hash(data) // 487f7b22f68312d2c1bbc93b1aea445b

data[0].foo = "changed";

hash(data) // 7663d8c57a4fe7d83db6bbc1bff52586

【问题讨论】:

  • 看起来您未公开的 hash 函数返回的哈希值实际上发生了变化 - 有什么问题?
  • 这是一个例子。我实际上没有它的工作。我认为我的问题是我传递的是一个对象,而不是一个字符串。我想我应该把它串起来。
  • JSON.stringify 然后

标签: javascript encryption hash


【解决方案1】:

它不起作用,因为我传递的是一个对象,而不是一个字符串。

const SHA256 = require("crypto-js/sha256");

let data = [
  { foo: "foo", bar: "bar", baz: "baz" },
  { foo: "foo", bar: "bar", baz: "baz" },
  { foo: "foo", bar: "bar", baz: "baz" },
  { foo: "foo", bar: "bar", baz: "baz" }
];

let foo = JSON.stringify(data);

console.log(SHA256(foo).toString());

【讨论】:

  • 请注意,散列需要 exact 字符串可用,以便散列匹配。您可能在编码或object ordering 方面遇到问题,因为JSON.stringify 的实现可能会在您的浏览器中发生变化。此外,可能无法与其他语言的其他 JSON 实现兼容。
【解决方案2】:

你几乎做到了。

let dataHash1 = hash(data);
data[0].foo = "changed";
let dataHash2 = hash(data);

let isChanged = false;
if (dataHash2 === dataHash2) {
  isChanged = true;
}

如果您的数据发生更改,isChanged 变量将为 true,如果您的数据保持不变,则为 false。

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2018-05-16
    • 2011-06-23
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多