在SQL或PL / SQL中为CLOB计算文档hashCode

时间:2016-01-15 16:29:10

标签: java sql oracle hash plsql

我正在寻找帮助在SQL中复制Java的String.hashCode()函数。它计算如下: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

我可以使用java程序轻松完成,但我有很多CLOB需要处理,我在想(也许是错误的?)更新将在服务器上运行得更快,而不会处理网络开销。有人有这样的功能吗?

有些要求是:

  1. 它是在SQL或Oracle的PL / SQL中,因为我在Oracle上这样做(遗憾地)
  2. 它适用于CLOB,而不仅仅是varchars
  3. 它可以处理大型CLOB(> 4K)
  4. 它也不必使用java hashCode(),它可以使用不同的哈希算法,如MD5SUM,如果它更容易做到的话。我将需要更新大约一百万条记录,并将使用散列来指示源文档(或转换过程)是否会导致更改的文档。

1 个答案:

答案 0 :(得分:0)

我在Oracle中发现了ora_hash(),但它看起来只是查看文档的第一个4K。相反,我正在使用:

CREATE OR REPLACE FUNCTION get_md5sum_clob_fn( i_clob IN CLOB)
    RETURN RAW
IS
BEGIN
    RETURN
        DBMS_CRYPTO.HASH
        (
            src => i_clob,
            typ => DBMS_CRYPTO.HASH_MD5
        );
END;

我也只给出这个非空的CLOB,否则会出错。它受到一些限制:

  1. 我没有测试它是否看起来过4K
  2. 具体是Oracle。
  3. 所以我还没有接受我自己的答案。我很乐意看到一个独立于数据库的解决方案。