【发布时间】:2020-10-04 16:39:41
【问题描述】:
这些天来,我正在学习散列,我提出了一个问题,我知道我可以为 unordered_map 分配一个自定义散列,但我可以为 unordered_map 分配一个自定义 mod 值吗?如果可以的话,怎么做?我在互联网上搜索过,但找不到答案,但是当我对字符串进行哈希处理时,我应该在计算中取模,如果我的模值和 unordered_map 的模值不同,这也会导致问题在竞争性编程中,几乎所有的哈希都是可破解的,如果我可以将我的随机 mod 值分配给 unordered_map,它会更安全,那么我该如何解决这个问题,或者我可以将我的值分配给 unordered_map?
#include<bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
vector<int> pr, ip(1e6);
int ind = -1;
//Sieve
for (int i = 2; i < 1e6; ++i) {
if (!ip[i]) {
if (ind == -1 && i > 1e5) ind = pr.size();
pr.push_back(i);
for (int j = i; j < 1e6; j += i) ip[j] = i;
}
}
const int mod = pr[uniform_int_distribution<int>(ind, pr.size() - 1)(rng)];
struct chash {
size_t operator ()(string x) const {
// Hash Function with using mod value
}
};
unordered_map<string, int, chash> umap;
//assign my mod value to umap
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int val;
string s;
cin >> x >> val;
umap[s] = val;
}
}
【问题讨论】:
-
自定义模组是什么意思?你的意思是一个函数,它接受一个哈希值并在桶数组中返回一个索引?你希望这个索引是随机的吗?那么你怎么能两次访问同一个元素呢?
-
我的意思是我可以像我的自定义哈希表一样使用无序映射吗,我想无序映射对所有元素使用我的模块值,所以它们不会被随机化
-
我认为这里存在一些概念上的混淆。什么是
mod value,为什么你认为unordered_map有一个?散列仅由提供的散列函数完成,地图完全不知道它的作用。 -
为什么要担心拥有一个“可破解的”哈希表并使其更安全?你想保护它免受什么影响?
-
molbdnilo,在 codeforces 中,用户可以破解彼此的积分解决方案,不安全的哈希表对参赛者来说是坐鸭。
标签: c++ stl std unordered-map