Hash 如何获取BTreeMap中用于值的哈希值

Hash 如何获取BTreeMap中用于值的哈希值,hash,rust,btreemap,Hash,Rust,Btreemap,我目前正在使用BTreeMap,因为我需要稳定的排序 是否有一个Rust映射结构,允许我暂时向有序映射添加一个新的键/值,并查看散列是什么 目前,我必须克隆整个BTreeMap,添加键/值,获取散列并删除克隆。这似乎非常浪费。假设您谈论的是通过其方法返回的整个树的哈希,那么您可以看到它是: 我更改了标题,主要是将模糊的“地图”更改为特定的BTreeMap。一些映射类型提供了一种方法来查询hash_builder,因此HashMap的答案就不一样了。例如,如果不同的插入顺序会产生不同的哈希,那么您

我目前正在使用
BTreeMap
,因为我需要稳定的排序

是否有一个Rust映射结构,允许我暂时向有序映射添加一个新的键/值,并查看散列是什么


目前,我必须克隆整个
BTreeMap
,添加键/值,获取散列并删除克隆。这似乎非常浪费。

假设您谈论的是通过其方法返回的整个树的哈希,那么您可以看到它是:


我更改了标题,主要是将模糊的“地图”更改为特定的BTreeMap。一些映射类型提供了一种方法来查询hash_builder,因此HashMap的答案就不一样了。例如,如果不同的插入顺序会产生不同的哈希,那么您只需要使用新摘要更新当前哈希。如果插入顺序不重要,那也是一样,但是你必须确保你的哈希更新函数是可交换的。这个问题的一个问题是它看起来像一个XY问题。你想看到散列的原因不清楚,可能是基于错误的前提。问题很复杂,BTreeMap不是基于散列的,你在说什么散列?对于
HashMap
,您可以从中创建一个
Hasher
实例,然后使用该Hasher
hash
键。我也不确定你希望它告诉你什么。@kmdreko谢谢,添加了一个带有
merge()
fn hash<H: Hasher>(&self, state: &mut H) {
    for elt in self {
        elt.hash(state);
    }
}
fn hash_with_extra<H: Hasher>(map: &BTreeMap<i32, i32>, state: &mut H, extra: &(i32, i32)) {
    let mut it = map.iter();
    let mut done = false;
    while let Some (elt) = it.next() {
        if extra.0 == elt.0 {
            extra.hash (state);
            done = true;
            break;
        } else if extra.0 < elt.0 {
            extra.hash (state);
            elt.hash (state);
            done = true;
            break;
        } else {
            elt.hash (state);
        }
    }
    if done {
        while let Some (elt) = it.next() { elt.hash (state); }
    } else {
        extra.hash (state);
    }
}
fn hash_with_extra<H: Hasher>(map: &BTreeMap<i32, i32>, state: &mut H, extra: &(i32, i32)) {
    for elt in merge (map.iter(), once (extra)) {
        elt.hash (state);
    }
}