2017-02-09 61 views
0

我想爲hive中的字符串計算散列,而不使用現有函數編寫任何UDF。這樣我就可以使用類似的方法在其他語言中獲得一致的散列。例如:是否有任何功能可以用來添加角色或XOR。在Hive中計算散列而不使用哈希函數

+0

Your title says *「without use exisiting hash fuction」*,but your question says *「only using exisiting functions」*這是完全相反的。你想要什麼,實際上? –

+0

您必須對您正在使用的Hive版本和您提到的其他語言 –

+0

「更具體一些」以便我可以使用類似的方法來獲得其他語言中一致的哈希值「因此,如果我使用現有的哈希函數,如果我用其他語言計算它的話會相似。所以我想使用「其他」現有函數來計算最簡單的哈希,我也可以在其他語言中進行復制。對於例如:我想bucketize字符串,所以我可以做ASCII(「abc」)%NoofBuckets它會給我ascii的第一個字符,但分佈跨桶不會那麼好。所以我需要一些更合理的東西。 –

回答

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位散列)

select XYZ, crc32(XYZ) from ABC
需要蜂巢1.3和適用普通的舊循環冗餘校驗(可能通過java.util.zip.CRC32)返回BIGINT(32位散列)

select XYZ, md5(XYZ), sha1(XYZ), sha2(XYZ,256), sha2(XYZ,512) from ABC
需要配置單元1.3和適用強,加密個散列函數,返回一個STRING與二進制(128,160,256和512位散列)的十六進制表示

[編輯]答案that post還具有用於施加加密散列函數具有非常好的解決方法舊版本的Hive,使用Apache Commons靜態方法和reflect()