给出2个整数a和b(正或负)。是否有用于生成唯一ID号的公式/方法?
注意:1。f(a,b)和f(b,a)的结果应该不同。 2.计算f(a,b)x次(x> 1),结果应相同。
为了弄清楚这个问题,这个函数f(n)=(n * p)%q(其中n =输入序列值,p =步长,q =最大结果大小,n =非负整数, n< q,p< q,p⊥q(coprime))将给出唯一的ID号。
但是,根据我的要求,输入是两个数字,a和b可以是负整数或正整数。
任何参考文献都很明显
答案 0 :(得分:2)
你可以通过右移第一个整数为32然后加上第二个整数,从2个整数(32位)生成一个长(64位)。
private long uniqueId(int left, int right) {
long uniqueId = (long) left;
uniqueId = uniqueId <<< 32;
uniqueId += (long) right;
return uniqueId;
}
答案 1 :(得分:1)
假设您的整数的范围为[MIN_INT,MAX_INT]
。然后,给定此范围内的整数n
,函数
f(n) = n - MIN_INT
在f(n)
范围内归属唯一的正整数[0, MAX_INT - MIN_INT]
,通常称为 rank 。
表示M = MAX_INT - MIN_INT + 1
。然后,要查找两个连续整数g(n,m)
和n
的唯一ID m
,您可以使用也用于二维数组的公共访问样式:
g(n,m) = f(n)*M + f(m)
也就是说,您只需将第二个整数偏移最大可能值并依靠。
实际上,当然,为了避免溢出,你必须小心 - 也就是说,你应该使用一些合适的数据类型。
以下是一个示例:假设您的整数来自[-1,4]
范围,因此M=6
。然后,对于此范围之外的两个整数n=3
和m=-1
,g(n,m) = 3*6 + 0 = 18
可用作id。