2013-12-12 25 views
0

我的目標語言是C++,但這是一個關於面向對象編程的問題。使用緩存哈希值來加速平等測試

假設我有一個類,其中測試相等需要一個非常重要的時間,但我也有一個散列值,我已經計算了它。我可以依靠數據在對象的生命中保持不變。

緩存散列值並用它來測試不等式常見做法嗎?

爲了讓這個例子更具體一些,我有一個類包含一個可能很長的2D位置列表,我期望在它上面做很多很多的相等比較。我通過混合所有位置的哈希來創建哈希值。

當測試相等時,我首先檢查散列值。如果哈希值相等,我會做詳盡的逐點平等測試。否則,我稱他們不平等。

回答

0

只要您的散列算法能夠保證爲相同的輸入數據生成相同的散列,聽起來不錯。然後,你的支票應該加速大幅度增加存儲散列值的額外內存的小額費用(以及計算哈希的1次計算成本)

0

我想你的意思是說:「如果散列是不等於,我會做詳盡的逐點平等測試。」

在任何情況下 - 是的,你有一個好主意,這是一個完全合理的設計。你正在爲大量昂貴的CPU和/或牆壁時間交易一點便宜的存儲空間。像這樣的設計可以帶來巨大的性能優勢。例如,考慮每個單獨的點測試需要數據庫查詢的情況。

+0

感謝您的回答。 如果兩個對象產生不等散列,那麼它們應該是不相等的。 – Larry

+0

對 - 如果哈希值相等,那麼你知道你可以跳過所有的逐點檢查。正確? –

+0

可以依靠包含相同數據的兩個對象來產生相同的散列值,但相反是不正確的;具有不同數據的對象可以產生相同的散列值(有時稱爲散列衝突)。所以,如果哈希值不同,我可以肯定我有不同數據的對象。如果它們是相同的,我不能完全確定它們具有相同的數據,所以我必須進行更深入的檢查。 – Larry