【问题标题】:Calculate hash without using exisiting hash fuction in Hive在不使用 Hive 中现有的哈希函数的情况下计算哈希
【发布时间】:2017-02-09 13:56:34
【问题描述】:

我想计算 hive 中字符串的哈希值,而无需仅使用现有函数编写任何 UDF。这样我就可以使用类似的方法在其他语言中获得一致的哈希值。例如:是否有任何函数可以让我做一些事情,比如添加字符或采用 Xor。

【问题讨论】:

  • 你的标题说“不使用现有的哈希函数”,但你的问题说“只使用现有的函数”,这恰恰相反。你到底想要什么??
  • 您必须更具体地了解您使用的 Hive 版本以及您所指的其他语言
  • “这样我就可以使用类似的方法在其他语言中获得一致的哈希”所以如果我使用现有的哈希函数,如果我用其他语言计算它就不会相似。所以我想使用“其他”现有函数计算最简单的哈希值,我也可以用其他语言复制这些函数。例如:我想对字符串进行分桶,这样我就可以做 ASCII("abc")%NoofBuckets 它会给我第一个字符的 ascii,但是跨桶的分布不会那么好。所以我需要一些更合理的东西。

标签: hive


【解决方案1】:

这取决于 Hive 的版本,参见。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Misc.Functions

select XYZ, hash(XYZ) from ABC
多年来一直可用并应用普通的旧 java.lang.String.hashCode(),返回一个 INT(32 位哈希)

[Edit 2] 实际上它有点复杂,因为hash() 接受任何类型的参数列表(包括没有内置散列方法的原始类型),因此使用自定义方法 - - 检查源代码中的ObjectInspectorUtils.hashCode()ObjectInspectorUtils.getBucketHashCode() here (for V2.1)

select XYZ, crc32(XYZ) from ABC
需要 Hive 1.3 并应用普通的旧循环冗余检查(可能通过 java.util.zip.CRC32),返回 BIGINT(32 位哈希)

select XYZ, md5(XYZ), sha1(XYZ), sha2(XYZ,256), sha2(XYZ,512) from ABC
需要 Hive 1.3 并应用强大的加密散列函数,返回一个带有二进制表示的十六进制字符串(128、160、256 和 512 位散列)


[编辑 1]that post 的答案也有一个非常好的解决方法,可以使用 Apache Commons 静态方法和 reflect() 在旧版本的 Hive 中应用加密哈希函数。

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2017-12-26
    • 2016-06-23
    • 2016-03-25
    • 2017-10-01
    • 2012-06-03
    • 2017-10-28
    • 2016-03-05
    相关资源
    最近更新 更多