尋求特殊用途的指紋/散列算法
對於一個項目,我想知道是否存在某種固定大小的校驗和/指紋功能,其中基於給定數據塊1的這個指紋,很容易生成更多共享相同指紋/雜湊鍵的數據塊。
因此,這與 MD5 和不同。(因為我不知道如何輕鬆地從 MD5 sum →新匹配文件返回。)
基本上,我希望生成一組數據塊,這些數據塊散列到數據塊 1 的相同指紋。數據塊 2、3、4 等…可能大小相同甚至小於 1——理想情況下,資訊熵越少更好——但該系列必須是確定性和有限的,並且在計算上很容易找到。
評論#1 幫助我收緊一些屬性。特別是,考慮到映射
hash[key][index] -> datablock
例如,給定一個 32 字節的鍵,**索引應該是連續整數,就像您在數組中所期望的那樣,並且固定索引應該映射到固定數據塊(對於該鍵)。在該組數據塊中,每個數據塊應計算到相同的雜湊鍵,但在列舉時應保持其相對索引位置(例如,datablockYYY 應始終且僅在比 datablockBBB 高 15 個索引位置處找到)。
棘手的部分可能是雜湊的索引範圍不應該大到需要與數據塊本身一樣多的熵位,但要少得多:比方說,為了更簡單的測試,限制為 31 位無符號整數。事實上,當我計算給定我的起始datablock1的****key1時,我希望找到一個datablockN,其雜湊中的索引離 datablock1 的索引不太遠。數據塊不必都具有相同的大小,也不一定所有可能的大小塊都可以通過特定鍵映射(相反的鴿巢原理)。一個到函式?不確定術語。
希望使用熟悉的東西大大減少問題將有助於闡明一些問題,儘管這裡存在顯著差異。
對於加密雜湊函式,我們通常希望盡可能避免衝突(甚至更希望避免以任何方式從輸出返回原像)。
所以你想要的當然不是加密雜湊函式,而是別的東西。
乍一看,CRC(循環冗餘校驗)之類的東西可以滿足您的要求。它們具有將任意長度的消息減少為固定長度的校驗和的特性( $ n $ 位CRC- $ n $ ),並給定一個 $ n $ -bit 校驗和和一個字元串的前綴,只有 $ n $ 位失去,它只需要一些線性代數來計算恰好失去的一個後綴。(您可以省略其他部分,但計算會更複雜一些。)
所以假設你的數據塊是 $ m $ 位,我們有功能
$$ \def\Z{\mathbb Z}\def\invC{\operatorname{inv}!CRC} CRC : \Z_2^m \to \Z_2^n, $$ $$ \invC : \Z_2^{m-n} \times \Z_2^n \to \Z_2^m, $$ 在哪裡 $ \invC(x,y) $ 擁有 $ x $ 作為第一個 $ m-n $ 位,和 $ CRC(\invC(x,y)) = y $ . 我不確定這是否符合您的要求-您可以 $ y $ 作為關鍵和 $ x $ 作為索引,或相反。
您可以為您的案件使用拉賓的指紋