最近出现了一个有趣的问题。我们遇到了一些使用hashCode()作为MD5加密盐源的代码,但这引发了一个问题:hashCode()是否会为同一对象返回相同的值在不同的虚拟机、不同的JDK版本和操作系统上?即使不能保证,到目前为止它是否有任何变化?编辑:我的意思是String.hashCode()而不是更通用的Object.hashCode(),后者当然可以被覆盖。 最佳答案 没有。来自http://tecfa.unige.ch/guides/java/langspec-1.0/javalang.doc1.html:Thegenera
我们有一个需求,要在一个文件中读取/写入超过1000万个字符串。我们也不希望文件中有重复项。由于字符串在读取后会立即刷新到文件中,因此我们不会在内存中维护它。我们不能使用哈希码,因为哈希码中存在冲突,我们可能会错过重复的字符串。我在谷歌搜索中发现的另外两种方法:1.使用像MD5这样的消息摘要算法-但计算和存储的成本可能太高。2.使用校验和算法。[我不确定这是否会为字符串生成唯一键-有人可以确认]还有其他方法吗?谢谢。 最佳答案 如果您可以接受微小的碰撞风险,您可以按照您的建议使用一些散列函数,例如MD5,并依赖于散列。另一种可能占用
将两个相同的对象添加到一个集合后,我希望该集合只包含一个元素。publicvoidaddIdenticalObjectsToSet(){Setset=newHashSet();set.add(newFoo("totoro"));set.add(newFoo("totoro"));Assert.assertEquals(1,set.size());//PROBLEM:SIZE=2}privateclassFoo{privateStringid;publicFoo(Stringid){this.id=id;}publicStringgetId(){returnid;}publicboole
最近,我遇到了一段代码,其中Map被使用,其中Integer(键)是hashCode一些字符串和String对应的值。这是正确的做法吗?因为现在,equals不会为String调用打电话时get.(get也是使用String对象上的hashCode()方法完成的。或者,hashCode(s)对于唯一的字符串是唯一的?我检查了equals欧德String类(class)。有为此编写的逻辑。我很困惑。 最佳答案 HashMap确实使用equals()来比较键。它只使用hashCode()来查找key所在的bucket,因此比equals
假设我有一个带有字段颜色和型号的汽车类。我需要将汽车存储在一个集合中,其中我不会重复(没有2辆相同的汽车)。在下面的示例中,我使用的是HashMap。根据Java文档,如果我们有2个Car对象car1和car2满足car1.equals(car2)==true,那么它还必须包含car1.hashCode()==car2.hashCode()。所以在这个例子中,如果我想只通过颜色比较汽车,那么我将只使用equals()和hashCode()中的颜色字段,正如我所做的那样在我的代码中,它工作得很好。publicclassCar{Stringcolor;Stringmodel;@Overri
我分析了Java中的HashMap源码,得到一个关于put方法的问题。JDK1.6中的put方法如下:publicVput(Kkey,Vvalue){if(key==null)returnputForNullKey(value);inthash=hash(key.hashCode());inti=indexFor(hash,table.length);for(Entrye=table[i];e!=null;e=e.next){Objectk;if(e.hash==hash&&((k=e.key)==key||key.equals(k))){VoldValue=e.value;e.val
//学生.javaclassStudent{privateintroll;privateStringname;publicStudent(introll,Stringname){this.roll=roll;this.name=name;}publicinthashCode(){returnroll+name.length();}publicbooleanequals(Objectobj){Students=(Student)obj;return(this.roll==s.roll&&this.name.equals(s.name));}}//问题ID.javaclassIssueID
我对Java中使用EqualsVerifier的equals和hashCode契约有一些疑问图书馆。假设我们有这样的东西publicabstractclassPerson{protectedStringname;@Overridepublicbooleanequals(Objectobj){//onlynameistakenintoaccount}@OverridepublicinthashCode(){//onlynameistakenintoaccount}}以及以下扩展类:publicfinalclassWorkerextendsPerson{privateStringworkD
编辑:准备我的对象以便在HashMap中使用。在阅读了一些有关如何生成哈希码的内容后,我现在有点困惑。我的(可能是微不足道的)问题是,当我有一个可以使用的字段时,我应该如何实现hashCode方法?我可以直接使用这些字段吗?如果我理解正确,hashCode的值在对象的生命周期内不得更改,并且我只有一个适合这个的ID文件,但我在其他地方读过,那个不应该使用ID...尽管如此,如何基于这个(唯一且不变)值的hashCode函数会是什么样子?equals方法也仅基于id.. 最佳答案 如果您的对象是可变的,那么随时间更改其哈希码是可以接受
我正在尝试为一个Java对象获取一个唯一的哈希值,例如以下情况为真:如果A==B则A.HashValue()==B.Hash.HashValue()如果A!=B那么A.HashValue()!=B.HashValue()假设对象包含几个boolean值和整数字段。 最佳答案 //非常重要的编辑...Gjorgji,我知道你认为下面的答案是正确的,但我发现它是不正确的。如果你有这样的类:classtiny{inta;publicinthashCode(){returna;}}您已经用完了所有可能的哈希码。(如果不清楚原因,请说明。)因