2016-05-17 21 views
0

我想找到一個項目的替代索引,並且該項目可以切換回其原始索引。 目前,該方案並不完美 -XOR在兩個數字之間切換,mod怎麼樣?

說,一個項目的標籤是指數1本來,我想將它移動到索引2

所以index2 = (index1^tag) % max_index

如果我想將它移回索引1

僅有index1 = (index2^tag) % max_index

時MAX_INDEX是2

功率上述等式僅保持

例如:

(^123)%64 ==

(^123)%64 ==

(^123)%60 ==

(^123)%60 == 7(!= 15

不知是否有其它是數學操作,允許MAX_INDEX中的任意數。


編輯:

我需要使用相同的操作來實現兩個指數之間的切換。

我的場景是 - 我有一個散列表,每個桶最多可以存儲4個項目,它只存儲項目的指紋(比如說8位)。如果桶已滿,我需要將物品的指紋移動到其替代位置,而無需知道其原始表示。一旦移動到替代位置,指紋可以使用與前一個相同的操作移回原始位置(因爲我不知道指紋的當前位置是原始位置還是替代位置)。

現在 - index = (index1^Hash(tag)) % max_index

+0

你可能會喜歡[杜鵑哈希](https://en.wikipedia.org/wiki/Cuckoo_hashing)。這就是說,你的動機有很多不足之處:1.爲什麼只存儲指紋? 2.爲什麼需要使用相同的操作返回? 3.爲什麼只需要使用指紋移動? –

+0

其實,它是[杜鵑過濾器]的設計(https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf)。但它需要使濾波器功率的大小爲2. – Leo

+1

謝謝,這解釋了很多動機。我會盡力在今天下午更新我的回答,並提出一些進一步的想法。 –

回答

1

加法和減法,做工精細;如果

index2 = (index1 + tag) % max_index 

然後

index1 = (index2 - tag) % max_index 

在一些語言中,%奇怪的是負數實施;如果這是您的問題,您可以使用

index1 = (index2 + max_index - tag) % max_index 

以避免問題。


經過一番淋浴的思考,我提出以下協議。首先選擇你喜歡的對稱分組密碼;對密碼的限制是:

  • 明文空間必須至少有max_index元素
  • 密文空間不應超過max_index元素太多了更大
  • 密鑰空間或許應該比你的標籤空間大(不是硬性要求)

然後你按照下面的步驟來交換指標:

do { index = encrypt(tag, index); } while(index >= max_index); 
do { index = index^1;   } while(index >= max_index); 
do { index = decrypt(tag, index); } while(index >= max_index); 

如果密文空間的大小爲c*max_index,則預計會進行c加密和解密。您從另一端獲得的索引將與其以低概率開始的索引相同 - 只有在索引加密至max_index-1(且max_index爲奇數)或加密將兩個相鄰值映射爲兩個相鄰值時纔會發生。

+0

看起來很好! 但是如果(index2 + max_index - tag)仍然是負數? – Leo

+0

@Leo在'index2'是非負的,'tag'小於'max_index'的假設下 - 這對我來說似乎都是合理的假設 - 那麼'index2 + max_index - tag'將是非負的。 –

+0

@Danial Wagner,對不起在我的場景中,標記可能比max_index大。 在Python中,負面的工作很好,但在C中它將是錯誤的。 – Leo