2011-06-21 223 views
0

給定一個數字,如何從該數字創建唯一密鑰。當給定不同的數字時,該鍵不應該重複。當提供相同的號碼時,它應該返回與之前生成的相同的密鑰,我在我的應用程序中需要這個密鑰。請問你可以推薦任何算法生成唯一密鑰

編輯:對不起,我改變了Q當你們回答Q我認爲上面的Q是一個更好的方式問,我的Q是在我的B-樹我存儲IP地址(src ip和dst ip)的ipv4我正在生成使用目標ip的密鑰,例如:如果我有一個地址172.28.6.100我生成一個密鑰使用最後兩個字節爲600(6 * 100)現在我必須存儲甚至ipv6地址如何生成一個密鑰,我需要爲每個地址生成一個uniqe密鑰。

+1

我們知道你需要它,否則你就不會問。 –

+1

你需要什麼樣的鑰匙?如果它是一個數字,你可以返回相同的數字! –

+2

當人們寫答案時,你是否完全改變了問題? – littleadv

回答

1

你的算法(從原來的問題,在這裏你說你是從生成的IP地址a.b.c.d關鍵c*d)甚至不保證唯一性你的IPv4地址172.28.6.12將具有與172.28.12.69.45.3.2410.1.72.1(等等)相同的密鑰。

這是散列的必然結果,您可以將多個項目映射到一個鍵。

我的問題是:爲什麼是你哈希。您可以將IPv4地址分爲四個字節,並將Ipv6分成十六個字節。它們不是很大,當然不能把整個地址當作鑰匙嗎?

而且,即使它們太大,如果您的要求在整個允許的IP地址範圍內都是唯一的,那麼您可能必須這樣做。 保證唯一性的唯一方法是以某種方式限制輸入值。


由於您已更改您的問題以刪除具體內容,因此我將添加此附錄。我的答案背後的原因沒有改變。

如果你哈希數據生成密鑰,只有兩種方法來保證密鑰的唯一性:

  • 使用相同的位數爲你的數據做的關鍵;或
  • 以某種方式限制數據。

第一個購買你很少。將稀疏數據映射到連續索引以進行高效查找有時很有用,但不會爲您節省任何空間。

二是經常使用,你知道的數據,如限制(1)你的所有IP地址開始10.1或他們是1000和1099。

之間的所有整數不過,除非你選擇一個這些限制中,沒有辦法保證不會有關鍵的衝突。

+1

OP在他的問題中提到了IP?我很困惑... – littleadv

+1

@littleadv:原來的問題。 – paxdiablo

0

爲什麼不使用散列算法?鑑於這個數字是一個4字節的整數,任何像樣的散列算法都會給你你所需要的,只要把它轉換成一個ASCII字符串。

您可以找到標準哈希算法列表here

您的編輯

對於您的B樹使用鍵後(原來我讀的許可證密鑰,這就是爲什麼我提到翻譯成ASCII) - 有沒有任何理由不使用目標IP的全部作爲一個關鍵(無論是IPv4還是IPv6,最多的是128位,非常合理)。否則,除非您對網絡地形有一些假設或知識,否則無法確保您所需的唯一性。

1

除非你正在處理的IP地址空間被很好的約束(即你來挑號碼,他們是一個專用網絡,如10.xxx的一部分),使用最後的兩個字節,並將它們相乘在一起會針對不同IP的碰撞,只要最後的答案股份超過一個乘數,它可以創建相同的密鑰,他們也不會發生衝突的唯一途徑是,如果你使用的八位字節都是素數(這是他們不能)。

而不是創建一個帶有鍵 - 值對的b-tree,我建議你使用IP地址本身作爲密鑰,不過,我不確定你會從這樣做中獲得什麼。

3
unsigned generate_key(int x) { return x; } 

總是爲不同的輸入返回不同的散列。這是一個理想的完善哈希函數