我需要为java中的任意字符串生成随机但可重复的数字。对于sql中的相同需求,我使用了函数 ORA_HASH
由oracle提供:
ora\u hash为表达式生成哈希值。您可以使用它将一组值随机分配到多个bucket中进行分析,或者生成一组随机数。
该函数有三个参数:要散列的表达式、最大桶数和种子。在sql中,最大bucket数被设置为允许的最大值。
我的想法是实施 ORA_HASH
在java中(具有最大桶数)。为此我想结合 String.hashCode()
一个随机的种子。
但是,我不知道如何将hashcode和seed结合起来
不会出现额外的哈希冲突( xor
可能不满足此要求)
无论是种子还是原始表达式都不能(容易地)从结果(简单的 +
不满足此要求)
有没有更好的解决办法?
编辑回复评论
我需要(几乎)唯一的伪标识符字符串,使他们匿名。我更倾向于“匿名化”/“难以逆转”,而不是“几乎独一无二”/“更少的冲突”。我的印象是 max_bucket_number
在 ora_hash
支持“更少的碰撞”和 seed
支持“难以逆转”。标准消息摘要(sha,md5)不适合,因为要散列的字符串来自字典;如果没有种子/盐,彩虹桌上的攻击将揭示出这些单词。一些使用salt的算法(例如bcrypt)生成非常长的哈希。 ora_hash
似乎是最好的取舍。
暂无答案!
目前还没有任何答案,快来回答吧!