【问题标题】:Can I Assign a Specific Mod Value for unordered_map我可以为 unordered_map 分配一个特定的 Mod 值吗
【发布时间】: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


【解决方案1】:

您一直在谈论的“mod value”只是将哈希值映射到哈希表下的向量中的一个位置。从逻辑上讲,它总是等于向量的当前大小。

如您所见,您可以调整的唯一旋钮是哈希函数。 它应该返回一个std::size_t 与合同,如果KeyEqual(A, B) 然后Hash(A) == Hash(B)

如果您想防止通过哈希冲突进行的拒绝服务攻击,您必须想出一个哈希函数,这样就很难找到许多具有相同哈希值的键。这里最常见的方法是将每个进程的随机种子混合到不容易猜测或预测的哈希值中。例如,不要只使用进程 ID 和 time() 输出,而是使用纳秒粒度计时器以及来自 /dev/random 的一些字节。

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 2020-08-30
    • 2017-06-25
    • 2023-02-16
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多