我试图弄清楚如何添加一个字段,该字段是其他字段的加密哈希。我有:
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,
}
}
}
然后,您可以使用Message
或Hashed<Message>
。如果您有一个
Hashed<Message>
,但您需要一个Message
,则可以借用该字段。否则,您将不得不创建一个新的Hashed<Message>
并再次计算哈希值。
关于rust - 如何添加一个字段,该字段是其他字段的加密哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63599241/