基本形式如下:我想要一个具有以下签名的函数:
unsigned long long getID(unsigned long long index) {
unsigned long long id;
/*code involving use of index*/
return id;
}
返回的id需要遵守以下约束:
getID(x) != getID(y)
和x
y
)y != x
getID(x) + 5 != getId(x+5)
代表任何x
1}})id
中不存在x
不存在getID(x) == id
。开始确定这个问题的最佳位置是什么?是否有一个通用解决方案可以扩展到128位(或减少到32位)数字而不会对代码结构进行重大更改?
答案 0 :(得分:3)
平凡地,与任何奇数素数相乘都有效。使用足够大的(大于1 <63)使图案不太明显。
请注意,如果您不喜欢可预测性,则可以合并任何两个答案。所以x*17 + 5
也是就是答案。
答案 1 :(得分:1)
您可以使用其他固定数字对您的号码进行异或:
unsigned long long getID(unsigned long long index) {
// Replace this with a less predictable number, if you want
return index ^ 0x123456789ABCDEFULL;
}
这具有翻转索引中与固定数字中的1位相对应的所有位的效果。
它也是它自己的反转 - getID(getID(x)) == x
。
它不会完全扰乱你的数字,但是 - 靠近的指数通常会给出非常接近的ID。