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
实例,然后使用该Hasherhash
键。我也不确定你希望它告诉你什么。@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);
}
}