我使用了String
API中的hashCode()
方法,它为以下代码生成了值为99162322:
String str = "hello";
System.out.println(str.hashCode());
是否有任何Java API生成的哈希值只有5位数(63346),如下面的Oracle SQL?
select ORA_HASH('hello','99999') from dual --63346
答案 0 :(得分:4)
Oracle的ora_hash
函数旨在提供哈希码for distributing items into buckets efficiently。这使得函数的目的不等同于Java hashCode()
方法的目的。
似乎在Oracle中,最大值参数只是将哈希码的模数乘以最大值+ 1.
SQL> select ora_hash('hello', 49999) from dual;
ORA_HASH('HELLO',49999)
-----------------------
13346
在Java中,要提供等效值,您可以获得将哈希码除以该最大值加1的剩余部分。
int hash = str.hashCode() % (max + 1); // max could be 99999
但是,String
和Oracle的哈希算法不同,因此值会有所不同。
String s = "hello";
System.out.println(s.hashCode() % 100000);
输出:
62322
此外,Java哈希码的范围是带符号int
的范围,ora_hash
的范围是无符号整数的范围。
答案 1 :(得分:1)
不确定为什么需要这个,但你可以修改结果,例如......
String h = "blah";
int hash = h.hashCode() % 100000; // Would give numbers from 0-99999
int hash = h.hashCode() % 10000; // Would give numbers from 0-9999
我想你需要它返回与Oracle函数认为完全相同的数字吗?
答案 2 :(得分:1)
最简单的方法就是使用模数,即:
int hash = str.hashCode() % 100000; // results 0-99999
但是,无论何时创建哈希函数,您都需要意识到冲突的可能性很高,这可能会影响性能。
你是否需要你的哈希函数输出与Oracle Hash完全相同的字符串哈希值? Note that ORA_HASH
can return any max, by specifying the max_bucket
argument. See linked documentation