2014-01-17 75 views
7

什麼樣的散列算法用於內置的HASH()函數?什麼樣的散列算法用於Hive的內置HASH()函數

我理想的是尋找一個SHA512/SHA256哈希,類似SHA()函數在Pig中的linkedin datafu UDF中提供的哈希。

+0

您可以通過返回類型說出一大堆。由於HASH()函數返回(32位)INT類型,因此可以安全地假定它不是SHA512或SHA256,因爲它們分別具有512位或256位返回類型。 –

回答

19

HASH函數(自Hive 0.11開始)使用類似於java.util.List#hashCode的算法。

其代碼如下所示:

int hashCode = 0; // Hive HASH uses 0 as the seed, List#hashCode uses 1. I don't know why. 
for (Object item: items) { 
    hashCode = hashCode * 31 + (item == null ? 0 : item.hashCode()); 
} 

基本上它是一個典型的散列算法在書中有效的Java建議。 引述一個偉大的人(和一個偉大的book):

值31的選擇是因爲它是一個奇素數。如果它甚至是 並且乘法溢出,信息將會丟失,因爲 乘以2相當於移位。使用 素數的優點不太清楚,但它是傳統的。 31的一個不錯的屬性是 ,乘法可以被移位和減法 代替以獲得更好的性能:31 * i ==(i < < 5) - i。現代虛擬機會自動執行這種優化。

我離題了。你可以看看HASH來源here

如果你想在蜂房使用SHAxxx那麼你可以使用Apache DigestUtils類和蜂巢內置reflect功能(我希望會工作):

SELECT reflect('org.apache.commons.codec.digest.DigestUtils', 'sha256Hex', 'your_string') 
+0

它轉換成字符串..給定int類型 – user145610