什麼樣的散列算法用於內置的HASH()函數?什麼樣的散列算法用於Hive的內置HASH()函數
我理想的是尋找一個SHA512/SHA256哈希,類似SHA()函數在Pig中的linkedin datafu UDF中提供的哈希。
什麼樣的散列算法用於內置的HASH()函數?什麼樣的散列算法用於Hive的內置HASH()函數
我理想的是尋找一個SHA512/SHA256哈希,類似SHA()函數在Pig中的linkedin datafu UDF中提供的哈希。
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')
它轉換成字符串..給定int類型 – user145610
您可以通過返回類型說出一大堆。由於HASH()函數返回(32位)INT類型,因此可以安全地假定它不是SHA512或SHA256,因爲它們分別具有512位或256位返回類型。 –