rust - 如何添加一个字段,该字段是其他字段的加密哈希?

标签 rust

我试图弄清楚如何添加一个字段,该字段是其他字段的加密哈希。我有:

pub struct Message {
    pub size: usize,
    pub id: MessageId,
    pub attribute: MessageAttribute,
}
我想要类似的东西:
pub struct Message {
    pub size: usize,
    pub id: MessageId,
    pub attribute: MessageAttribute,
    pub hash: MessageHash,
}

pub struct MessageHash(pub Vec<u8>);
我可以创建另一个结构,然后在设置结构时计算哈希值:
pub struct HashedMessage {
    pub content: Message,
    pub hash: MessageHash,
}

pub fn message_hash(data: &Message) -> MessageHash {
    let mut hasher = DefaultHasher::new();
    data.hash(&mut hasher);
    MessageHash(hasher.finalize().to_vec())
}

let content = Message { /* ... */ };
let hash = hash_message(msg);
let msg = HashedMessage { content, hash };
此方法引入了另一个结构,我将不得不更改代码库以使用新结构来代替旧结构。
我的另一种方法是拥有一个new方法,该方法接收该结构的每个成员,然后输出最终的结构,并在输入上计算出哈希字段。这似乎是合理的。一种可能的选择是在此方法中将哈希设置为0,然后在message_hash结构(第一个嵌入了哈希字段的结构)上使用Message计算哈希,然后对其进行分配。
还有另一种方法吗?什么是添加哈希的惯用正确方法?这些消息将被序列化并通过网络发送,因此我没有一种每次都能计算哈希值的方法。

最佳答案

您可以使用如下组成:

pub struct Message {
    pub size: usize,
    pub id: MessageId,
    pub attribute: MessageAttribute,
}

pub struct Hashed<M> {
    pub hash: MessageHash,
    pub message: M,
}

impl<M> Hashed<M> {
    fn new(message: M) -> Self {
        let hash = compute_hash(&message);
        Self {
            hash,
            message,
        }
    }
}
然后,您可以使用MessageHashed<Message>
如果您有一个Hashed<Message>,但您需要一个Message,则可以借用该字段。否则,您将不得不创建一个新的Hashed<Message>并再次计算哈希值。

关于rust - 如何添加一个字段,该字段是其他字段的加密哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63599241/

相关文章:

rust - 我可以在 Rust 中将 const 与重载运算符一起使用吗?

enums - 如何在给定特征的枚举关联方法上匹配 Self

rust - 在跟踪中访问 Span 的字段值

rust - 是否可以克隆 `skip_while` ?

rust - 当特征和结构使用相同的方法名时如何调用方法?

enums - 如何访问枚举变体未命名字段?

rust - Clone::clone_from 如何避免不必要的分配?

module - 错误[E0277] : the trait bound `my_struct::MyStruct: my_trait::MyTrait` is not satisfied

rust - 我可以接受两个&str参数并返回一个或另一个吗?

rust - 我应该使用&str或String来实现TryFrom