散列函数在Java中仅用5位数字生成散列值

Sud*_*ddy 4 java oracle hash

我已经使用hashCode()StringAPI的方法,它为以下代码生成的值为99162322:

String str = "hello";           
System.out.println(str.hashCode());
Run Code Online (Sandbox Code Playgroud)

是否有任何Java API可以生成仅5位数字(63346)的哈希值,例如下面的Oracle SQL?

select ORA_HASH('hello','99999') from dual  --63346
Run Code Online (Sandbox Code Playgroud)

rge*_*man 5

Oracle的ora_hash功能旨在提供用于将项目有效地分布到存储桶中的哈希码。这使得函数的目的与目的Java的hashCode()方法没有最大的等效性。

看来在Oracle中,最大值自变量只是将哈希码的模数乘以最大值+ 1。

SQL> select ora_hash('hello', 49999) from dual;

ORA_HASH('HELLO',49999)
-----------------------
                  13346
Run Code Online (Sandbox Code Playgroud)

在Java中,要提供一个等效值,您可以获得将哈希码除以该最大值加1的余数。

int hash = str.hashCode() % (max + 1);  // max could be 99999
Run Code Online (Sandbox Code Playgroud)

但是,和的哈希算法String不同,因此值将不同。

String s = "hello";
System.out.println(s.hashCode() % 100000);
Run Code Online (Sandbox Code Playgroud)

输出:

62322
Run Code Online (Sandbox Code Playgroud)

另外,Java哈希码int的范围ora_hash是有符号的范围,而的范围是无符号整数的范围。


Bre*_*etC 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
Run Code Online (Sandbox Code Playgroud)

我想你需要它返回与 Oracle 函数认为的完全相同的数字,对吗?