我可以为unordered_map分配特定的Mod值

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

[这些天,我正在学习哈希,并且遇到一个问题,我知道我可以为unordered_map分配一个自定义哈希,但是我可以为unordered_map分配一个自定义mod值,如果可能的话,怎么办?我已经在Internet上搜索了它,但找不到答案,但是当我对字符串进行哈希处理时,我应该在计算时采用取模,如果我的取模值和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;
    }
}    
c++ stl std unordered-map competitive-coding
1个回答
0
投票

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

您可以调整的唯一旋钮是哈希函数,如您所见。应该返回带有std::size_t则为KeyEqual(A, B)的合同的Hash(A) == Hash(B)

[如果要防止通过散列冲突进行的拒绝服务攻击,则必须提供一个散列函数,该函数很难找到具有相同散列值的许多键。这里最常用的方法是将每个进程的随机种子混合到无法轻易猜测或预测的哈希值中。例如,不要仅使用进程ID和time()输出,而要使自己基于纳秒级粒度计时器,甚至可能基于/dev/random中的某些字节。

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