内置的HASH()函数使用什么样的哈希算法?
我理想地寻找SHA512 / SHA256哈希,类似于SHA()函数在猪的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());
}
基本上它是“Effective Java”一书中推荐的经典哈希算法。引用一个伟大的人(和一个伟大的book):
选择值31是因为它是奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以2相当于移位。使用素数的优势不太明显,但它是传统的。 31的一个很好的属性是乘法可以用移位和减法代替以获得更好的性能:31 * i ==(i << 5) - i。现代VM自动执行此类优化。
我离题了。你可以看看HASH
源here。
如果你想在Hive中使用SHAxxx那么你可以使用Apache DigestUtils类和Hive内置的reflect
函数(我希望它能工作):
SELECT reflect('org.apache.commons.codec.digest.DigestUtils', 'sha256Hex', 'your_string')
从Hive 2.1.0开始,有一个mask_hash
函数将散列字符串值。
对于Hive 2.x,它使用md5作为散列算法。这是Hive 3.x的changed to sha256