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

用于在java中生成只有5位数字的哈希值的哈希函数,java,oracle,hash,Java,Oracle,Hash,我使用了StringAPI中的方法,它为以下代码生成值99162322: String str = "hello"; System.out.println(str.hashCode()); 是否有任何Java API像下面的Oracle SQL那样生成只有5位(63346)的哈希值 select ORA_HASH('hello','99999') from dual --63346 我不太清楚你为什么需要这个,但是你可以修改结果,例如 String h = "blah

我使用了
String
API中的方法,它为以下代码生成值99162322:

String str = "hello";           
System.out.println(str.hashCode());
是否有任何Java API像下面的Oracle SQL那样生成只有5位(63346)的哈希值

select ORA_HASH('hello','99999') from dual  --63346

我不太清楚你为什么需要这个,但是你可以修改结果,例如

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函数完全相同的数字,对吗?

最简单的方法就是使用模数,即:

int hash = str.hashCode() % 100000; // results 0-99999
但是,无论何时创建哈希函数,都需要注意冲突的可能性很高,这可能会影响性能

是否需要哈希函数为字符串输出与Oracle哈希完全相同的哈希


进一步阅读:

Oracle的
ora_hash
函数旨在提供哈希代码。这使得没有最大值的函数的用途等同于Java的
hashCode()
方法的用途

在Oracle中,maximum value参数似乎只取散列码的模的最大值+1

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

ORA_HASH('HELLO',49999)
-----------------------
                  13346
在Java中,为了提供一个等价值,您可以获得哈希代码除以该最大值加上一的剩余值

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
的范围是无符号整数。

感谢您的回复。是的,类似于Oracle,但我需要唯一的哈希代码。对于ex“str1***.”。哈希代码%10000不应与“str***.”相同。哈希代码%10000。使用MOD i可以用不同的字符串得到相同的结果,对吗?@SudarsanaKasireddy-在这种情况下,实际上没有“唯一”哈希代码这样的东西-特别是如果您只有5位数字来表示您可能创建的每个字符串。如下所述,Java中的“hashCode”基本上用于将数据组织成一系列“bucket”。“equals”方法可用于判断具有相同哈希代码的两个实例是否为相同的“对象”。我希望这能澄清一些问题。Tks Bret…我将尝试不同的方法,用5生成独特的值digits@SudarsanaKasireddy除非字符串长度小于6位且仅包含数字,否则这是不可能的