如何在Java中将字符串散列为带范围的整数

如何在Java中将字符串散列为带范围的整数,java,string,hash,hashcode,Java,String,Hash,Hashcode,假设我有n个字符串,现在我想使用一个函数将每个字符串映射到一个0到n-1范围内的整数,这样每当我调用一个函数并传递字符串和n时,它都会给我相同且唯一的映射。因此,假设我有4个字符串“str1”、“str2”、“str3”、“str4”,那么映射将从0-3开始,并且是唯一的 我尝试了类似这样的操作:str.hashCode()%n,这给了我相同的映射,但不在0到n-1的范围内。我在PHP中发现了与此类似的东西- 记录在案 在Java中,将随机字符串哈希为整数: 结果将为0(含0)到6(含6) 注:

假设我有n个字符串,现在我想使用一个函数将每个字符串映射到一个0到n-1范围内的整数,这样每当我调用一个函数并传递字符串和n时,它都会给我相同且唯一的映射。因此,假设我有4个字符串“str1”、“str2”、“str3”、“str4”,那么映射将从0-3开始,并且是唯一的

我尝试了类似这样的操作:
str.hashCode()%n
,这给了我相同的映射,但不在0到n-1的范围内。我在PHP中发现了与此类似的东西-

记录在案

在Java中,将随机字符串哈希为整数: 结果将为0(含0)到6(含6)

注: 如果输入字符串真的是随机的并且长度相同等等(例如…输入是一整批UUID),那么这里的输出将是随机平衡的

如果输入的是很多人名,那么输出就不太可能是随机平衡的

注: 这里回答了OP在标题中提出的问题


事实上,OP询问的内容(在正文中)与散列没有任何联系。(那只是一个查找表,一个正则表达式或诸如此类的东西。)

嗯,你说什么
str.hashCode()%n
应该正是您想要的。我这样做了,但对于某些字符串,它给我的值是负数,而不是0到n的范围-1@ElliottFrisch鲁宾逊会有危险的!你没听说过多基因润滑剂吗
Math.abs(str.hashCode()%n)
是您想要的。@Y0geshGupta冲突是什么意思?无论使用什么散列,都会发生冲突,因为字符串的数量远远超过
int
@Y0geshGupta的大小,任何两个字符串都有可能给出相同的散列。任何两个字符串都有1/n的可能给出相同的hash mod n
Math.abs(str.hashCode() % 7)