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

问题描述 投票:8回答:2

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

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

hive md5 hashcode sha256
2个回答
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 << 5) - i。现代VM自动执行此类优化。

我离题了。你可以看看HASHhere

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

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

0
投票

Hive 2.1.0开始,有一个mask_hash函数将散列字符串值。

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

© www.soinside.com 2019 - 2024. All rights reserved.