2016-02-09 16 views
0

的基本形式是這樣的:我想用下面的簽名功能:如何將所有的64位整數到不同的64位整數MAP,在1對1的方式

unsigned long long getID(unsigned long long index) { 
    unsigned long long id; 
    /*code involving use of index*/ 
    return id; 
} 

的ID返回需要遵循以下限制:

  • 不能有(任何xygetID(x) != getID(y)其中y != x)任何衝突
  • 應該不會出現任何顯然本爲了將生成的數字(也沒關係,如果有一些順序,但一般,getID(x) + 5 != getId(x+5)任何x
  • 每一個64位數字必須由函數表示。換句話說,不可能存在id,其中不存在x,其中getID(x) == id

什麼是開始確定這個最好的地方,並且是那裏,可以擴展到128位(或減少到32位)的數字,但無代碼的結構顯著變化的一般的解決方案?

+0

'return id == 0? ULLONG_MAX/2 + 1:(id == ULLONG_MAX/2 + 1?0:-id);' –

+0

你看過任何簡單的PRNG實現嗎?給定一個種子(索引),他們以確定性的方式輸出另一個數字(id)。 – twsaef

+1

這是爲了安全嗎? – immibis

回答

3

平凡地說,乘以任何奇素數都可以。使用足夠大的圖案(多於1 < 63)以使圖案不太明顯。

請注意,如果您不喜歡可預測性,可以將任意兩個答案組合。所以x*17 + 5是一個答案。

+0

這是我最喜歡的答案;我將運行一些測試,看看它是否適合我的目的。 – Xirema

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。