我如何接受具有任何哈希算法的 Rust HashMap?

How can I accept a Rust HashMap with any hashing algorithm?

我正在开发一个库,该库具有我希望能够接受任何哈希算法的 HashMap 的功能。但是当我尝试使用特定类型的 HashMap 调用它时,例如 FnvHashMap,编译器会报错。

pub fn func(map: HashMap<u32, u32>) {}

let map: FnvHashMap<u32, u32> = FnvHashMap::default();
func(map);
error[E0308]: mismatched types
  --> lib.rs:42:10
   |
42 |     func(map);
   |          ^^^ expected struct `RandomState`, found struct `BuildHasherDefault`
   |
   = note: expected struct `HashMap<_, _, RandomState>`
              found struct `HashMap<_, _, BuildHasherDefault<FnvHasher>>`

由于 FnvHashMap 只是一个类型别名,我认为这不会成为问题。

我确定有办法做到这一点,但我还没有找到。正确的做法是什么?

HashMapin the docs的定义是:

pub struct HashMap<K, V, S = RandomState> { /* fields omitted */ }

RandomState 是默认类型,但可以用其他类型覆盖它,包括泛型。可能不是很清楚,但是大多数 HashMap 方法都在 an impl block 中声明,约束 S: BuildHasher,这是你需要绑定它的特征:

use std::hash::BuildHasher;

pub fn func<S: BuildHasher>(map: HashMap<u32, u32, S>) {}