2015-06-10 86 views
1

我想知道在諸如Hazelcast之類的鍵值存儲中使用散列(CityHash,Murmur之類)作爲鍵是否是個好主意。我期望在數據庫中擁有大約2,000,000,000條記錄(URL),因此可能會發生衝突。通過散列衝突丟失一些數據並不是非常關鍵,但當然最好避免它們。使用散列作爲鍵值存儲中的ID

一條記錄包含URL,時間戳,狀態碼。主要操作是插入並查找URL是否已存在。

所以,你會建議什麼,給定的速度是相關的:使用

  • 一個ID generator,或
  • 使用哈希算法像CityHash或雜音,或
  • 使用相關的字符串,URL在這種情況下,它本身?
+0

需要存儲的數據的其餘部分是什麼?你需要運行什麼類型的操作?只需插入並檢查重複?或者你是否在計算訪問量或報告URL歷史記錄?我見過的許多鍵值存儲都會在後臺散列處理字符串鍵,包括透明地處理不同字符串之間的散列衝突。因此,在前面添加您自己的散列碼可能會降低性能。 –

+0

感謝您的評論。我爲我的問題添加了一些細節。 – deamon

回答

2

Hazelcast不依賴於密鑰對象的hashCode/equals方法,而是使用密鑰二進制表示的MurMur哈希。

總之,你不應該真的擔心哈希碰撞。

+0

解釋一些例子會很好。 – Nilambar

+0

@Nilambar我不認爲我可以在這裏給出任何有意義的例子,因爲散列發生在幕後。 相關代碼可以在以下方法中找到: com.hazelcast.map.impl.proxy.MapProxyImpl#put(K,V,long,java.util.concurrent.TimeUnit) –