内置的HASH()函数使用了哪种散列算法?
我理想地寻找SHA512 / SHA256哈希,类似于SHA()函数在猪数据库UDF中提供的哈希值。
答案 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