我已经使用hashCode()
了String
API的方法,它为以下代码生成的值为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)
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
是有符号的范围,而的范围是无符号整数的范围。
不太确定为什么你需要这个,但你可以修改结果,例如......
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 函数认为的完全相同的数字,对吗?
归档时间: |
|
查看次数: |
4719 次 |
最近记录: |