gpt4 book ai didi

rust - 如何使用serde-json库为包含原始值的结构计算哈希

转载 作者:行者123 更新时间:2023-12-03 11:38:08 25 4
gpt4 key购买 nike

我需要我的结构是可哈希的。这些结构在创建后再也不会发生变化,因此可以预先计算并将其存储为字段。
一个示例结构如下所示:

#[derive(Clone, Debug, Deserialize)]
pub struct Predicate {
note: Option<String>,
arguments: Option<HashMap<String, Value>>,
value: Value,
}
我试图将 Hash指令添加到struct,但是 Value没有实现 Hash试图实现自己 impl Hash for Value {但出现错误
    | ^^^^^^^^^^^^^^-----
| | |
| | `Value` is not defined in the current crate
| impl doesn't use only types from inside the current crate
所以两种可能的解决方案对我来说就足够了
  • 计算并存储反序列化的哈希值,并将其另存为struct的字段(永不更改)
  • Hash上实现Value-但不确定是否可以在serde crate 之外进行操作。

  • 选项1可能对我有用(反序列化时计算+存储)
    我在文档 https://serde.rs/field-attrs.html#deserialize_with中看到了 #[serde(deserialize_with = "path")]但没有看到如何完成此操作的任何示例
    也许还有其他方法?

    最佳答案

    由于HashMapValue都没有实现Hash,所以最好的选择是手动为Hash手动实现Predicate。为了减少重复,我还建议对Value进行包装,并为此实现哈希。执行此操作时,请确保如果a == b,然后是a_hashed == b_hashed。样例代码:

    impl Hash for Predicate{
    fn hash<H: Hasher>(&self, hasher:&mut H){
    self.note.hash(hasher);
    self.arguments.iter().for_each(|(key,value)|{
    //Without realizing it, I accidentally violated the contract I mentioned above
    //Because there is no guarantee about the order of items returned by HashMap.iter().
    //Thanks, @Jmb for pointing it out. Let this serve as a warning, be really
    //Careful when manually implementing Hash and similar traits.
    key.hash(hasher);
    MyValue(value).hash(hasher);
    });
    MyValue(self.value).hash(hasher);
    }
    }

    struct MyValue(Value);
    impl Hash for MyValue{
    fn hash<H: Hasher>(&self, hasher:&mut H){
    //large match statement here
    }
    }
    OP提到他们可以保证对象只能被创建一次并且不会被突变。如果是这样,您可以改为添加唯一的标识符,例如来自 UUID Crate或创建和哈希的时间戳,而不是昂贵得多的完整哈希。

    关于rust - 如何使用serde-json库为包含原始值的结构计算哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66013990/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com