Java 计算CLOB的SQL或PL/SQL中的文档哈希代码

Java 计算CLOB的SQL或PL/SQL中的文档哈希代码,java,sql,oracle,hash,plsql,Java,Sql,Oracle,Hash,Plsql,我正在寻找在SQL中复制Java的String.hashCode()函数的帮助。计算如下: s[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1] 我可以用java程序轻松地完成这项工作,但我有很多CLOB需要处理,我认为(可能是错误的?)更新可以在服务器上运行得更快,而不需要处理网络开销。有人有这样的功能吗 有些要求是: 它应该是SQL或Oracle的PL/SQL,因为我是在Oracle上这样做的(很遗憾) 它适用于CLOB,而不仅仅是VARCHAR 它可以处理大型CLO

我正在寻找在SQL中复制Java的String.hashCode()函数的帮助。计算如下:

s[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]

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

有些要求是:

  • 它应该是SQL或Oracle的PL/SQL,因为我是在Oracle上这样做的(很遗憾)
  • 它适用于CLOB,而不仅仅是VARCHAR
  • 它可以处理大型CLOB(>4K)
  • 此外,它不必使用java hashCode(),如果更容易的话,它可以使用不同的散列算法,如MD5SUM。我需要更新大约一百万条记录,并将使用散列来指示源文档(或转换过程)是否导致文档发生更改。

    我在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,否则会有一个错误。它有一些局限性:

  • 我还没有测试它是否看起来超过4K
  • 它是特定于Oracle的

  • 所以我还没有接受我自己的答案。我希望看到一个独立于数据库的解决方案。

    为什么需要这个?通常,最好使用非平台特定的散列,例如UTF-8的MD5,或者更安全的散列。即使你确实需要这样做,你也应该考虑“开发时间”以及“经过的时间”——如果你可以在半小时内通过“从数据库中拔出,在本地计算哈希代码,推”来实现它,那么,如果整个周末都需要运行,这是否重要?我并不需要它是特定于平台的,我可以用Java(MD5,SHA)轻松计算任何合理的散列,也可以在数据库中计算。安全性不是问题,我使用此字段作为唯一约束的一部分(以及文档源和源文档id)来检测源文档中的更改,因为源文档更改不会更新源文档标识符,或者源文档转换过程中的更改导致新的CLOB。因此,如果您有一个使用MD5的解决方案,我很高兴看到它。我将调查Oracle支持什么。如果它支持MD5、SHA-1、SHA-256等,我一点也不会感到惊讶。这比使用Java的哈希代码要好得多。我刚刚意识到的另一个复杂问题可能是Java的字符串是本地UTF-16,我相信,我正在使用一些Oracle 11g默认西方字符集或类似的CLOB。我需要的东西,可以给双方一致的答案。我想如果我坚持在数据库端计算它,我就不在乎了。“使用这个字段作为唯一约束的一部分”。散列不能保证对不同的源材料是唯一的,因此在唯一约束中使用散列是非常麻烦的。请使用缩进而不是三倍反勾号来引用so中的块代码。