如何以1对1的方式将所有64位整数映射到不同的64位整数

时间:2016-02-09 23:10:07

标签: c++

基本形式如下:我想要一个具有以下签名的函数:

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}})
  • 每个64位数字必须由该函数表示。换句话说,id中不存在x不存在getID(x) == id

开始确定这个问题的最佳位置是什么?是否有一个通用解决方案可以扩展到128位(或减少到32位)数字而不会对代码结构进行重大更改?

2 个答案:

答案 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。