有时候用哈希总会感觉心里不稳,怕脸黑撞生日悖论 FST 或者被别人 Hack 之类的,而多模哈希有太慢。今天逛 CF 评论区 看见了一种比较优秀的做法,再此 mark 一下。
ull mix(ull o)
{
o+=0x9e3779b97f4a7c15;
o=(o^(o>>30))*0xbf58476d1ce4e5b9;
o=(o^(o>>27))*0x94d049bb133111eb;
return o^(o>>31);
}
元组 Hash 同样可以:
ull hash(int a) { return mix(a.first^mix(a.second)); }
顺便 mark 一下科学的随机数生成方法(c++11)
#include <algorithm>
#include <chrono>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());