【The Orange Box】卡掉unordered

xiaoxiao2022-06-11  81

测试环境: Ubuntu 18.04.1 LTS Intel® Core™ i5-4590 CPU @ 3.30GHz × 4

使用如下代码:

#include <bits/stdc++.h> using namespace std; #define MAXN 100000 void insert_numbers(long long x) { clock_t timestart=clock(); unordered_map<long long,int> numbers; for(int i=1;i<=MAXN;i++) numbers[i*x]=i; long long sum=0; for(auto element:numbers) sum+=(element.first/x)*element.second; printf("x = %lld : %.3lfseconds, sum = %lld\n",x,(double)(clock()-timestart)/CLOCKS_PER_SEC,sum); } int main() { insert_numbers(107897); insert_numbers(126271); }

编译参数:

g++ hack.cpp -o hack

运行结果:

可以看到,第一次插入需要大量时间(第二次插入供对比)。

如何防hack?

将unordered_map的hash方法改为手写的hash方法。

这里提供一种参考:

#include <bits/stdc++.h> using namespace std; #define MAXN 100000 struct custom_hash { unsigned long long operator()(unsigned long long x)const { x+=0x9e3779b97f4a7c15; x=(x^(x>>30))*0xbf58476d1ce4e5b9; x=(x^(x>>27))*0x94d049bb133111eb; return x^(x>>31); } }; void insert_numbers(long long x) { clock_t timestart=clock(); unordered_map<long long,int,custom_hash> numbers; for(int i=1;i<=MAXN;i++) numbers[i*x]=i; long long sum=0; for(auto element:numbers) sum+=(element.first/x)*element.second; printf("x = %lld : %.3lfseconds, sum = %lld\n",x,(double)(clock()-timestart)/CLOCKS_PER_SEC,sum); } int main() { insert_numbers(107897); insert_numbers(126271); }

编译参数:

g++ hack.cpp -o hack

运行结果:

防hack成功!

转载请注明原文地址: https://www.6miu.com/read-4930556.html

最新回复(0)