簡體   English   中英

如何使用兩個不同的數字生成唯一密鑰,然后使用這些數字之一檢索此密鑰

[英]How can I generate unique key using two different numbers and then retrieve this key by using one of these numbers

有兩個不同的數字我必須生成一個唯一的密鑰。 例如,我有 37 和 8,通過對它們使用 XOR,我將得到 45,這是我的唯一鍵。 但隨后我需要使用其中一個數字(37 或 8)來檢索這個唯一鍵。 所以問題是,如何使用兩個不同的數字生成唯一密鑰,然后使用這些數字之一檢索該密鑰? 允許使用第三個數字(掩碼、密鑰等),但我需要一個唯一的密鑰才能真正唯一。


編輯:

好的,對於可能不清楚的問題,抱歉。 我有內存中的鍵對象存儲。 以 Memcached 為例,沒關系。 在那里我可以為 object 添加一些值並指定字符串鍵,例如 Cache.Add(“mykey”, myobj); 但在我的應用程序中,同樣的 object 有兩個標識符,integer 和字符串。 所以我希望能夠像這樣添加到緩存中 Cache.Add(“mykey”, 1, myobj); 然后使用其中一個標識符獲取相同的緩存 object。 像這樣 Cache.Get(1) 或 Cache.Get(“mykey”); 字符串可以計算成 hash,所以這就是我問兩個整數的原因。 我的存儲實際上是 SharedCache。 我只是不想改變 SharedCahce 的核心,所以可能有一個通過標識符之一計算密鑰的解決方案。


好了朋友們。 感謝您的回答。 但是,如果使用第三個 static 數字來計算密鑰/哈希怎么辦。 然后將其與用於確定密鑰的標識符(數字)之一一起使用,N1 = 37 N2 = 8 SN3 = 999(硬編碼) key(n1, n2) = key(n1,sn3) = key(n2,sn3)

另外我正在考慮將我的標識符保存在 QWORD 中。 來自字符串標識符的 Hash 保存在較高的 DWORD 中,而 int 標識符保存在最低的 DWORD 中。 然后在方法 Cache.Get 我可以確定參數的類型,如果它的 int 則在較低的 DWORD 中查找,如果類型是字符串,則在較高的 DWORD 中查找。

下面是另一種沒有異或的方法:

要從 2 個整數 (a,b) 生成唯一鍵 x 並能夠從該鍵中找到 (a,b),您可以執行以下操作:

從 a 和 b 生成 x:

x = (2**a).(3**b) //(** means power)

因為 2 和 3 是素數,所以 x 存在唯一的分解

然后從x中得到a和b;

 divide x by 2 until you don't get an integer => number of division =a
 divide x by 3 until you don't get an integer => number of division =b

代碼示例(在 python 對不起,我不太了解 C#):

>>> def keyGenerator(a,b):
    return (2**a)*(3**b)

>>> def findNumbersFromKey(x):
    a=0
    b=0
    while(x%2 ==0):
        a+=1
        x/=2
    while(x%3 == 0):
        b+=1
        x/=3
    return a,b

>>> keyGenerator(5,4)
2592
>>> findNumbersFromKey(2592)
(5, 4)
>>> keyGenerator(25,14)
160489808068608L
>>> findNumbersFromKey(160489808068608L)
(25, 14)

key(a,b):= a XOR b 根本不是唯一的,例如 key(8,7) = 15 = key(12,3)。

假設您的對 (a,b) 是 0 <= a < N 和 0 <= b < M 范圍內的值,您可以分配 key(a,b):= a + b * N 這是唯一的並且在范圍內0 <= 鍵(a,b)< M*N。

我不明白您所說的“但是我需要使用其中一個數字(37 或 8)來檢索這個唯一鍵”是什么意思。 . 您是否希望僅給定 37 作為輸入來計算 key(37,8)? 這是不可能的。 僅給定 37 作為輸入,您想如何區分 key(37,8) 和 key(37,1234)?


更新:

如前所述,如果兩個鍵都是獨立的(即它們都不能從另一個有效地計算出來),那么您不能這樣做“僅從一個標識符計算唯一鍵”的東西。

為了解決您的問題,我會根據您提供的信息提出以下建議,並假設在調用 Add() 時兩個標識符都是已知的,並且任一標識符本身就足以唯一標識每個 object:

將“Hashtable aliasTable”成員添加到“Cache”。 調用“Cache.Add(strID, intID, obj)”時,使用“intID”作為唯一鍵。 此外,讓“aliasTable[strID] = intID”。 在“Cache.Get(intID)”上,只需使用“intID”作為唯一鍵。 在“Cache.Get(strID)”上,通過“intID = aliasTable[strID]”檢索唯一鍵。

如果您通過 strID 而不是 intID 更頻繁地進行緩存查找,則將其用作唯一鍵並反過來使用 aliasTable(將 intID 映射到 strID)。

如果要生成唯一鍵,只需連接兩個唯一數字。

在我的情況下,我需要根據兩個用戶的手機號碼為socket.io創建一個唯一的room_id

這樣

key(n1,n2) != key(n1,sn3) != key(n2,sn3) 

獨特性有多獨特? 異或兩個數字並不是生成唯一數字的好方法。

也就是說,對於您的具體示例,給定一個輸入數字和您的密鑰,然后將這兩者異或將給出第二個密鑰。

a XOR b = c
c XOR b = a

只需穿插兩個數字。 例如,如果您有 a=1234 和 b=99:

a =   1 2 3 4 
b =      9 9 
key = 1029394 

請注意,密鑰比 Ricky 的提議要小得多。

存儲對 object 的引用兩次,每個密鑰一次。 然后可以使用任一鍵檢索它。 如果您需要從緩存中刪除項目的能力,那么您將需要刪除這兩個引用。 為此,您可以將這兩個密鑰存儲在 object 本身中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM