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)