Function 函数f_k(x)->;bool,使得P(f_k(x))=1/k,和P(f_k(x)&x2227;f_j(x)|j!=k)=1/(jk)

Function 函数f_k(x)->;bool,使得P(f_k(x))=1/k,和P(f_k(x)&x2227;f_j(x)|j!=k)=1/(jk),function,Function,我想要一个函数 bool fun(uint key, uint N); 假设N至少为1,则返回key值中1的true。满足此约束的一个简单示例是 return (key % N) == 0; 然而,我还有一个额外的限制:fun(key,N)&&fun(key,M),其中M!=N、 对于键的1 in M×N值,必须仅为true。上述表达式不符合该条件,因为((键%2)==0)和&((键%4)==0)对于键的所有值的1/4而不是1/8为真 (近似)满足这两个属性的函数是 return (hash

我想要一个函数

bool fun(uint key, uint N);
假设
N
至少为1,则返回
key
值中1的
true
。满足此约束的一个简单示例是

return (key % N) == 0;
然而,我还有一个额外的限制:
fun(key,N)&&fun(key,M)
,其中M!=N、 对于
的1 in M×N值,必须仅为
true
。上述表达式不符合该条件,因为
((键%2)==0)和&((键%4)==0)
对于
键的所有值的1/4而不是1/8为真

(近似)满足这两个属性的函数是

return (hash(key ^ hash(N)) % N) == 0;
其中,
hash
是一些散列函数,如SHA-256。有没有一种方法可以满足这些约束而不必求助于哈希函数

编辑以添加:

精确解的一个例子是

return (key % factorial(N)) < factorial(N - 1);
return(键%factorial(N))
这个函数的问题是阶乘(N)很快变得不合理地大;58的阶乘大于2**256

我使用此函数将回答以下问题:“在我的
N+1
碎片一致散列中,密钥
key
是否属于碎片
N


在看到这些评论之后,我同意如果不使用散列式函数,这是不实际的,并且我发现,正如Chris Dodd所建议的,lcrng的三次传递足够好。我最终使用的特定算法是GNU libc的rand_r()代码。

用什么编程语言?@Barmar:任何语言,尽管我更喜欢C。这听起来更像是一个理论问题,而不是一个实际编程问题。也许cs.stackexchange.com会是一个更好的地方。你的问题基本上可以归结为“有没有可能在不使用哈希函数的情况下定义一个类似哈希的函数”,在这种情况下,答案取决于你认为哪些函数是或不是哈希函数。如果你只是想要一个快速散列函数,像lcrng的一个步骤可能就足够了,这取决于你想要它的确切原因……你的“约束”是统计约束(否则就不可能满足),所以任何结果都是统计的。一般来说,为了获得所需的形式,对于可能的键值上的一些(一组)置换,您将获得乐趣(k,N)=置换(key)%N==0。因此,归根结底,要选择适合你所做的任何事情的好/快的排列。快速散列函数是一个不错的选择,在网上搜索“快速散列函数”会给你很多答案。