hash函数,用于生成java中只有5位数的哈希值

时间:2015-04-15 16:14:50

标签: java oracle hash

我使用了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

3 个答案:

答案 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

进一步阅读:What is a good Hash Function?