对于给定的编译器,无序映射的顺序是否始终相同?

问题描述 投票:0回答:2

我刚刚在代码中发现了一个错误,该错误取决于元素存储在

unordered_map
中的顺序。好吧,没什么大不了的,我会解决它。我的问题只是出于好奇,想了解不同编译器中的不同实现。

在我的计算机(linux

g++
)上编译时,我的单元测试始终有效,因为
unordered_map
的顺序始终相同,并且顺序不会触发我的错误。

当在另一台计算机和架构(mac M1,

clang++
)上编译时,我的错误总是会被触发,因为元素总是以相同的顺序出现,这与
g++
不同。

当在我的计算机上编译时带有

clang++
:没有错误。

在我的具体情况下,

unordered_map
的键是
int
,哈希值是
int
的默认值,我没有使用自定义哈希函数。

我的问题是:

unorderd_map
的顺序如何取决于编译器的实现?我一直认为它有点随机,但我错了,它对于我测试的每个编译器都是稳定的。标准对此有何规定?订购
unordered_map
的典型实现是什么?

c++ g++ standards clang++ unordered-map
2个回答
2
投票

哈希函数确定元素被放置在哪个桶中。

std::unordered_map<Key,T>
使用
std::hash<Key>
作为默认哈希器。来自cppreference

实际的哈希函数取决于实现,并且不需要满足除上述指定之外的任何其他质量标准。值得注意的是,一些实现使用简单的(身份)哈希函数将整数映射到自身。换句话说,这些哈希函数旨在与无序关联容器一起使用,但不能作为加密哈希等使用。

这意味着您得到的结果顺序取决于实现。

我认为散列 int 在某种程度上是标准的。

定义的实现是“某种标准”;)。哈希函数仍然是研究的主题。选择最佳哈希值并不简单,如果标准能够修复一个目前最先进的特定哈希值,但在一年左右的时间内就会过时,那就糟糕了。


0
投票

哈希函数通常用在无序关联容器(例如哈希表、集合或映射)的上下文中。在这些情况下,重点是高效检索而不是加密属性。

© www.soinside.com 2019 - 2024. All rights reserved.