这是我的字符串哈希函数public class GoodHashFunctor implements HashFunctor { @Override public int hash(String item) { String binaryRepString = ""; for(int i = 0; i < item.length(); i++){ // Add the String version of the binary version of the integer version of each character in item binaryRepString += Integer.toBinaryString((int)(item.charAt(i))); } long longVersion = Long.parseLong(binaryRepString, 2) % Integer.MAX_VALUE; return (int) longVersion; }}但是,当我尝试对较大的String(大约10-15个字符)进行哈希处理时,会收到错误消息,因为当它尝试parseLong时,它会死,因为它太大了。你们都认为我该怎么办?我的教授说我们不能使用Java的hashCode()我看到了类似的帖子,其中最佳答案是通过这种方式进行哈希处理:int hash=7;for (int i=0; i < strlen; i++) { hash = hash*31+charAt(i);}但是我不会遇到同样的问题吗?我想以这种新方式打破它可能需要更长的时间。我不知道我很困惑... 最佳答案 为什么在将每个字符转换为long之前需要将其转换为字符串(以及二进制形式的字符串)?为什么不只是添加long的char值呢?这是家庭作业,所以我没有发布代码。您还可以查看任何优秀的算法书籍或在网上搜索以获取有关散列的更多信息。编辑:我知道您不希望只对它们进行总结,因为七巧板都具有相同的哈希值。但是我认为您已经知道如何避免这种情况。请注意,通过级联位,基本上是在将位移动了某些位置之后将位添加到值中。即“ 10101” +“ 10001”与1010100000 + 10001-21 通过将每个字符移位与其在字符串中的位置成比例的量,添加到哈希中的值取决于字符的值和位置。同样,只需简单地相乘而不是缩放,就可以观察到相同的效果。要注意的另一件事是long只有64位的事实。您只能在它开始溢出之前将很多char装入其中。因此,大多数实用的哈希函数将值取模数。当然,这意味着对于无限数量的输入字符串,只有有限数量的可能的哈希值。冲突是不可避免的,但是为您的shift / multiplier和mod选择的值可以最大程度地减少冲突次数。关于java - 如何为大型字符串制作一个良好的哈希函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6709951/