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

时间:2014-01-17 02:09:09

标签: hive md5 hashcode sha256

内置的HASH()函数使用了哪种散列算法?

我理想地寻找SHA512 / SHA256哈希,类似于SHA()函数在猪数据库UDF中提供的哈希值。

2 个答案:

答案 0 :(得分:20)

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());
}

基本上,它是“Effective Java”一书中推荐的经典哈希算法。 引用一个伟大的人(和一个伟大的book):

  

选择值31是因为它是奇数素数。如果它是均匀的   并且乘法溢出,信息将丢失,如   乘以2相当于移位。使用的好处   素数不太清楚,但它是传统的。 31的不错的财产是   乘法可以用移位和减法代替   为了更好的性能:31 * i ==(i <&lt; 5) - i。现代VM执行此操作   自动进行优化。

我离题了。您可以查看HASH来源here

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

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

答案 1 :(得分:0)

Hive 2.1.0开始,有一个<canvas width="200" height="200"></canvas>函数将哈希字符串值。

对于Hive 2.x,它使用md5作为哈希算法。这是Hive 3.x的changed to sha256