2014-01-17 3 views
7

ハイブのために使用されているハッシュアルゴリズムのどのようなビルトインHASH()機能が内蔵されてHASH()関数で使用されるハッシュアルゴリズムのどのような

私は、理想的にはSHA()関数は、豚のためのLinkedIn datafuのUDFの中に提供するものと同様に、SHA512/SHA256ハッシュを探しています。 (ハイブ0.11のような)

HASH
+0

あなたは戻り値の型によって多くのことを伝えることができます。 HASH()関数は(32ビット)INT型を返すので、SHA512またはSHA256ではなく、それぞれ512ビットまたは256ビットの戻り型を持つことになります。 –

答えて

19

関数は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で推奨されているように、古典的なハッシュアルゴリズムです。それは奇素数であるため、

値31を選択した: は偉大な男(と偉大book)を引用します。それも と乗算がオーバーフローした場合は2によって 乗算はシフトと同等であるとして、情報は、失われてしまいます。 プライムを使用する利点はあまり明確ではありませんが、伝統的です。 31の素敵なプロパティは、乗算がシフトし、パフォーマンス向上のために減算 に置き換えることができ です:31 * I ==(I < < 5) - I。現代のVMはこれを の最適化のように自動的に行います。

私は話を戻そう。 HASHソースhereを見ることができます。

あなたはハイブでSHAxxxを使用したい場合、あなたは(私はそれが動作していただければ幸いです)内蔵のreflect機能はApache DigestUtilsクラスとハイブを使用することができます。

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

指定されたint型の場合は文字列..に変換されます – user145610

関連する問題