std::unordered_map有没有可能发生碰撞?
Is there any possibility that std::unordered_map collides?
我在这里看到 post 你可以“遇到生日问题”。使用 std::unordered_map
When should I use unordered_map and not std::map
这让我很吃惊,这和说 std::unordered_map
是不安全的是一样的。真的吗?如果我不解释自己,让我给你举个例子:
unordered_map<size_t, size_t> m;
for (size_t i = 0; i < 100; ++i)
m[i] = i;
for (size_t i = 0; i < 100; ++i)
if (m[i] != i)
cerr << "ERROR!" << endl;
如果此代码在 main
中,是否有可能打印 ERROR!
?
Is there any possibility that std::unordered_map collides?
不是容器有冲突,而是您为容器提供的哈希函数。
是的,所有哈希函数 - 当它们的输出范围小于输入域时 - 都会发生冲突。
is there any possibility that it prints ERROR!?
不,这不可能。哈希函数将多个值放入一个桶中是完全正常的。这会在哈希冲突的情况下发生,但它也会发生在不同的哈希值上。查找函数将使用线性搜索获得正确的值。密钥的身份由相等函数确定,而不是由哈希函数确定。
我在这里看到 post 你可以“遇到生日问题”。使用 std::unordered_map
When should I use unordered_map and not std::map
这让我很吃惊,这和说 std::unordered_map
是不安全的是一样的。真的吗?如果我不解释自己,让我给你举个例子:
unordered_map<size_t, size_t> m;
for (size_t i = 0; i < 100; ++i)
m[i] = i;
for (size_t i = 0; i < 100; ++i)
if (m[i] != i)
cerr << "ERROR!" << endl;
如果此代码在 main
中,是否有可能打印 ERROR!
?
Is there any possibility that std::unordered_map collides?
不是容器有冲突,而是您为容器提供的哈希函数。
是的,所有哈希函数 - 当它们的输出范围小于输入域时 - 都会发生冲突。
is there any possibility that it prints ERROR!?
不,这不可能。哈希函数将多个值放入一个桶中是完全正常的。这会在哈希冲突的情况下发生,但它也会发生在不同的哈希值上。查找函数将使用线性搜索获得正确的值。密钥的身份由相等函数确定,而不是由哈希函数确定。