我想要一个功能
bool fun(uint key, uint N);
在true
N
的{{1}}值中返回key
,假设N
至少为1.满足此约束的一个简单例子是
return (key % N) == 0;
但是,我还有一个额外的约束:fun(key, N) && fun(key, M)
,其中M!= N,对于M {N}值true
中的1,只能是key
。上面的表达式不符合该标准,因为((key % 2) == 0) && ((key % 4) == 0)
对于key
的所有值的1/4而不是1/8都是正确的。
(大致)满足这两个属性的函数是
return (hash(key ^ hash(N)) % N) == 0;
其中hash
是一些哈希函数,如SHA-256。有没有办法在不诉诸哈希函数的情况下满足这些约束?
已编辑添加:
精确解决方案的一个例子是
return (key % factorial(N)) < factorial(N - 1);
这个函数的问题是阶乘(N)很快变得不合理地大;因子58大于2 ** 256。
我对此功能的使用是回答这个问题:“key
分片中我的一致哈希值中的密钥N
是否属于分片N+1
吗?”
看到评论之后,我同意如果不使用哈希风格函数这是不切实际的,而且我发现如克里斯多德所建议的那样,三次传递lcrng的效果还不错。我最终使用的特定算法是来自GNU libc的rand_r()代码。