Java 为与ora_散列相当的字符串生成随机且可复制的散列代码

Java 为与ora_散列相当的字符串生成随机且可复制的散列代码,java,string,oracle,random,hashcode,Java,String,Oracle,Random,Hashcode,我需要为Java中的任意字符串生成随机但可复制的数字。对于SQL中的相同要求,我使用了Oracle提供的函数: ORA_散列为表达式生成散列值。您可以使用它将一组值随机分配到多个bucket中进行分析,或者生成一组随机数 该函数有三个参数:散列表达式、最大桶数和种子。出于我在SQL中的目的,已将最大存储桶数设置为允许的最大值 我的想法是在Java中实现ORA_HASH(最大存储桶数)。为此,我想将String.hashCode()与一个随机种子组合起来 但是,我不知道如何将hashcode和se

我需要为Java中的任意字符串生成随机但可复制的数字。对于SQL中的相同要求,我使用了Oracle提供的函数:

ORA_散列为表达式生成散列值。您可以使用它将一组值随机分配到多个bucket中进行分析,或者生成一组随机数

该函数有三个参数:散列表达式、最大桶数和种子。出于我在SQL中的目的,已将最大存储桶数设置为允许的最大值

我的想法是在Java中实现
ORA_HASH
(最大存储桶数)。为此,我想将
String.hashCode()
与一个随机种子组合起来

但是,我不知道如何将hashcode和seed结合起来,以便

  • 不会出现额外的哈希冲突(
    xor
    可能不满足此要求)
  • 种子和原始表达式都不能(轻松地)从结果中复制(简单的
    +
    不能满足此要求)
  • 有没有更好的解决方案

    编辑回复评论


    我需要(几乎)唯一的字符串伪标识符来使它们匿名化。我更喜欢“匿名化”/“难以逆转”,而不是“几乎独一无二”/“更少冲突”。我的印象是,
    ora\u hash
    中的高
    max\u bucket\u编号
    支持“较少冲突”,而
    seed
    支持“难以逆转”。标准消息摘要(SHA、MD5)不适合,因为要散列的字符串来自字典;如果没有种子/盐,彩虹桌攻击将揭示这些单词。一些使用salt(例如bcrypt)的算法会生成非常长的哈希
    ora\u hash
    似乎是最好的折衷办法。

    您是否坚持在数据库中使用
    ora\u hash
    ?如果不是,为什么不使用Oracle和Java都支持的标准哈希算法呢?从Oracle,您可以使用。(这些都不是“随机的”——你可能想重新表述一下……)这是一个完全不同的背景。我这里没有可用的Oracle,只是借用了
    ora\u hash
    的思想。此外,没有必要保证结果是一致的。据我所知,
    ora_hash
    是“随机”的,因为种子是随机的:也就是说,如果你不知道种子,你就无法预测结果。你打算如何使用它?我这样问是因为你想要两个通常不应该同时需要的条件。对数据库中的“分组依据”之类的内容进行哈希处理需要管理冲突,但不要求“取消哈希”异常困难。对密码之类的内容进行哈希处理需要非常难以逆转,但并不特别担心冲突。这两种应用都有非常好的算法。为什么你同时需要这两个条件?@mathguy编辑了这个问题来回答你的正确观点!