跨行的 Oracle 哈希数据

Posted

技术标签:

【中文标题】跨行的 Oracle 哈希数据【英文标题】:Oracle hash data across rows 【发布时间】:2011-07-01 03:15:10 【问题描述】:

假设我有一个包含两列的 oracle 表:类型 varchar2 和数据 varchar2。我想知道在 plsql 或直接 oracle sql 中是否有某种有效的方法来计算所有数据列的散列(最好是 sha1,但 md5 或自定义 oracle 散列函数是可以接受的)。例如,解决方案的 mysql 实现可能如下所示:

mysql dialect query:
select type, sha1(group_concat(data order by data separator '')) data_hash from my_table group by type

example output:    
+------+------------------------------------------+
| type | data_hash                                |
+------+------------------------------------------+
| a    | dbe343bfc23545c72f11fc7d2433df3263a71d0d |
| b    | b2baee034a7ed3aa1fa1bd441e141909f1b2f57c |
+------+------------------------------------------+

我更喜欢直接查询而不是游标迭代,sha1 优于其他哈希。

【问题讨论】:

嗯?行不能有不同的类型 - 我认为你混淆了行和列。 我的意思是说列,让我解决这个问题,谢谢。 【参考方案1】:

你可以试试

SELECT type, SUM(ORA_HASH(data)) FROM my_table GROUP BY type

Oracle 确实有一个 COLLECT,但它不适用于 ORA_HASH。在 11g 中你可以做到

select deptno, ora_hash(listagg(ename) within group (order by ename))
from emp
group by deptno

【讨论】:

如果您想要 sha1,请查看 dbms_crypto (download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/…)。 为什么 SUM 是在 SUM(ORA_HASH(data)) 的上下文中做的?我认为 sum 用于 base10 算术......不结合哈希? ORA_HASH 返回一个数字,而不是十六进制样式的 VARCHAR2。如果您不关心哈希的顺序,那么 SUM 是一种组合它们的简单方法。【参考方案2】:

请参阅我对 getMD5 函数 here 的回答。正如其他人提到的那样,还可以查看DBMS_CRYPTO,这使用了较旧的混淆工具包,但方法是相同的。

要进行更新,例如:

update my_table
set my_hash = getMD5(col1 || col2 || col3);

【讨论】:

这无助于获取合并系列中所有数据的哈希值(但我没有投反对票,因为您提供了一些有用的链接:)

以上是关于跨行的 Oracle 哈希数据的主要内容,如果未能解决你的问题,请参考以下文章

确定跨行的唯一字典键

跨行的 SQL 求和

PoiExcel导入实现(解决跨行问题以及03和07版本问题)

POI跨行导出excell表格实现

POI跨行导出excell表格实现.md

跨行数据框中加权平均值的引导