如何为包含 HashMap 的结构派生哈希?

Wel*_*ll3 2 hashmap rust

我试图声明一个包含 HashMap 的结构,但它不允许我派生哈希。

use std::collections::HashMap;

#[derive(PartialEq,Eq,Hash)]
struct Environment{
    names:HashMap<String,String>,
} 
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 5

HashMap本身并没有实现Hash,所以自动推导是不可能的。您需要Hash手动实施。请注意,您必须小心确保手动实现与PartialEq的实现兼容HashMap;例如,您需要确保以一致的顺序散列键值对,因为键顺序与实现无关PartialEq

一种可能的实现将所有对收集(key, value)到一个向量中,对 进行排序key,并对结果向量进行哈希处理:

impl Hash for Environment {
    fn hash<H: Hasher>(&self, h: &mut H) {
        let mut pairs: Vec<_> = self.names.iter().collect();
        pairs.sort_by_key(|i| i.0);
        
        Hash::hash(&pairs, h);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这需要分配元素向量self.len(),但不需要复制字符串(它们是借用的)。


考虑改为使用BTreeMap<String, String>. 该类型实现,因此可以Hash自动推导:Hash

#[derive(PartialEq, Eq, Hash)]
struct Environment{
    names: BTreeMap<String, String>,
}
Run Code Online (Sandbox Code Playgroud)