什么样的哈希算法用于Hive的内置HASH()函数

use*_*532 8 md5 hive hashcode sha256

内置的HASH()函数使用什么样的哈希算法?

我理想地寻找SHA512/SHA256哈希,类似于SHA()函数在猪的linkedin datafu UDF中提供的哈希.

Nig*_*nel 20

HASHfunction(从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());
}
Run Code Online (Sandbox Code Playgroud)

基本上它是"Effective Java"一书中推荐的经典哈希算法.引用一个伟人(和一本好书):

选择值31是因为它是奇数素数.如果它是偶数并且乘法溢出,则信息将丢失,因为乘以2相当于移位.使用素数的优势不太明显,但它是传统的.31的一个很好的属性是乘法可以用移位和减法代替以获得更好的性能:31*i ==(i << 5) - i.现代VM自动执行此类优化.

我离题了.你可以在这里查看HASH来源.

如果你想在Hive中使用SHAxxx,你可以使用Apache DigestUtils类和Hive内置reflect函数(我希望它能工作):

SELECT reflect('org.apache.commons.codec.digest.DigestUtils', 'sha256Hex', 'your_string')
Run Code Online (Sandbox Code Playgroud)