函数f_k(x) - > bool,P(f_k(x))= 1 / k,P(f_k(x)∧f_j(x)| j!= k)= 1 /(jk)

时间:2014-08-28 23:36:49

标签: function

我想要一个功能

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()代码。

0 个答案:

没有答案