2013-07-20 23 views
0

是否有任何消息摘要算法,您可以在摘要上應用set函數,並且結果仍然有意義?換句話說,是否存在一個散列函數呢?不是在散列之前和之後打破了「set」的概念?基於集合的散列(摘要)算法?

我想找的散列函數:

  1. 散列一個設定數據轉換成固定長度的(或有界長度)串
  2. 產生相同散列如果輸入數據集是相同的
  3. 如果您選擇子集您的原始數據,它相當於散列數據子集,或將子集應用到原始數據集的散列,即您將得到相同的子集散列兩種方式。

作爲一個例子,在下面的圖片集A有幾個數據點(紅色dimonds)。 B是A的一個子集是否有這樣的散列函數:在甲

數據----散列函數----> _hashA ----設定操作----> _hashB

在乙----散列函數

數據----> _hashB

enter image description here

回答

0

AFAIK,沒有。散列函數通常(我見過很多)對單個數據塊進行操作,而不管數據實際表示什麼,主要關心的是降低碰撞概率。也就是說,可以想出你想做的事情,但我認爲這會非常困難,而且在碰撞避免方面的結果很可能不是最理想的。

0

簡短的答案是否定的,沒有這樣的算法。你可能會嘗試加密你的數據,然後在你需要應用你的設置函數時將其解密,然後再次加密。然而,散列算法本質上是一種方式,涉及數據的丟失。這裏有哈希算法和加密算法的區別的一個很好的解釋:Fundamental difference between Hashing and Encryption algorithms

1

這看起來有點像http://en.wikipedia.org/wiki/Homomorphic_encryption和有點像數據庫中隱私的方案,如http://en.wikipedia.org/wiki/Differential_privacy - 至少對我來說。

在這兩種情況下,開發人員都遇到了問題,因爲事實證明,一旦讓用戶做了一些事情,他們就可以找到聰明的方法來解決如何做任何他們想要的東西作爲構建塊,因此係統缺乏安全。在你的情況下,我認爲你需要AndHash(hash(a),hash(b))= hash(a和b)。這意味着如果散列(a)!=散列(空集),那麼我可以發現a是否是基於該散列值的任何集合的成員。如果發生這種情況,我可以根據散列值計算散列集的許多成員,這意味着散列值必須與集合相當大,因爲它包含其中的所有信息。

取決於你想要什麼,這可能是值得看看http://en.wikipedia.org/wiki/Minhash