当前位置: 首页 > 面试题库 >

HashCode给出负值

殳越
2023-03-14
问题内容

我通过执行以下功能将传入的字符串转换为哈希码,但其中一些值为负数。我不认为哈希值应该为负。请告诉我我在做什么错。

int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode();
System.out.println(combine);

问题答案:

我不认为哈希值应该为负。

为什么不?具有负哈希码是完全有效的。提出哈希码的大多数方法自然都以负值结尾,处理它们的任何事情都应考虑到这一点。但是,我会考虑采用另一种方法来计算您的哈希码,例如

int hash = 17;
hash = hash * 31 + srcadd.hashCode();
hash = hash * 31 + dstadd.hashCode();
hash = hash * 31 + sourceport; // I'm assuming this is an int...
hash = hash * 31 + destinationport; // ditto
hash = hash * 31 + protocol.hashCode();
return hash;

目前尚不清楚这些表达式的类型是什么,但是我猜想您最终将要使用字符串的哈希码……实际上并不需要创建一个字符串。尽管有更好的方法来获取已知域的哈希码,但上述方法可以用作通用哈希生成技术。

请注意,这也将有助于你的代码的可读性,如果你避免缩写,以及用于骆驼外壳,如sourceAddress代替srcadd



 类似资料:
  • 问题内容: 如果这样做,我遇到了Java 类问题: 这就是我得到的: 从我阅读的内容来看,应该只返回一个正数作为开始? 这可能有点牵强,但与在Windows 7 64位上运行64位计算机没有关系吗? 任何帮助都非常需要今天完成任务分配! 问题答案: 从Java文档中获得: 所有2 32个 可能的int值都是(近似)相等的概率产生的。 一种方法是使用以下转换: 之所以需要这样的原因(与使用绝对值或取

  • 问题内容: 根据Google Calculator 是。 根据Javascript(请参阅此JSBin),它是。 我该如何解决? 问题答案: Number.prototype.mod = function(n) { return ((this%n)+n)%n; };

  • 问题内容: 考虑下面的java代码。 输出量 价值的负值如何产生相同的价值? 但是结果不能是因为java中Integer的最大值是。 但是想知道为什么吗?内部正在发生哪种按位运算? 问题答案: 内部正在发生哪种按位运算? Java使用带符号数字的二进制补码表示。因此,更改符号操作包括两个步骤: 反转原始值的位,并 添加到结果中。 的表示如下: 反转产生 加法使其再次成为相同的数字,即 由于整数溢出

  • 问题内容: public class Test { 在第二个输出中,我认为整数范围已过,但是为什么要给出数字,它需要给我一个错误,这种行为的原因是什么? 提前致谢… 问题答案: 您溢出了32位整数的大小。 考虑当我等于10时会发生什么: 但是可以存储在32位整数中的最大正数仅为20亿左右(2个带有9个零)。 实际上,情况变得更糟!中间计算将以有限的精度执行,并且一旦10 * 10 * 10 * 1

  • 该属性返回一个整数,表示数值的哈希码。 语法 (Syntax) num.hashcode 例子 (Example) void main() { int n = 5000; print(n.hashCode); } 它将产生以下output - 成功执行代码后会显示以下输出。 5000

  • 我知道这可能会被选为副本(因为我已经看到了这张使用Dijkstra算法的负权重图,所以我认为其中没有一个答案是我想要的。我对Dijkstra算法在有一条负边的图中的解感兴趣,但Dijkstra仍然会显示正确的解。那张图会是什么样子?我无法想象,或者我不擅长enough需要了解Dijkstra如何处理负边缘。我知道有一个带负边的图,可以用Dijkstra遍历,并且仍然有正确的路径。请不要告诉我使用贝