Java 由于哈希冲突,哈希集是否安全
我的问题是,它是否总是处理哈希冲突?如果哈希完全相同,它如何确切地知道对象是不同的?他们是否检查了equals,如果是这样,这就不符合散列的意义了Java 由于哈希冲突,哈希集是否安全,java,hash,hashset,hashcode,sha256,Java,Hash,Hashset,Hashcode,Sha256,我的问题是,它是否总是处理哈希冲突?如果哈希完全相同,它如何确切地知道对象是不同的?他们是否检查了equals,如果是这样,这就不符合散列的意义了 与sha256相比,sha256对于我正在制作的程序几乎没有哈希冲突,如果我对字符串使用hashset,它会出错吗?String.hashCode()相互冲突的可能性有多大?比如,如果contains和add方法似乎都没有检查散列,为什么要使用散列?相等的散列代码并不意味着对象相等。根据托收合同, 如果两个对象相等,则它们应该具有相同的哈希代码,反之
与sha256相比,sha256对于我正在制作的程序几乎没有哈希冲突,如果我对字符串使用hashset,它会出错吗?String.hashCode()相互冲突的可能性有多大?比如,如果contains和add方法似乎都没有检查散列,为什么要使用散列?相等的散列代码并不意味着对象相等。根据托收合同, 如果两个对象相等,则它们应该具有相同的哈希代码,反之亦然 集合(如set和map)中的对象是否存在哈希冲突并不重要,它们将正常工作,直到equals方法能够区分对象。
尽管性能可能会降低,因为如果所有哈希相同,集合将有效地降低为列表。哈希集合和哈希映射的哈希冲突是预期的,也是允许的。这就是为什么对于可散列对象,几乎总是覆盖
equals
和hashCode
。Crypographic哈希(如sha256)对于不同的目的来说是完全不同的。请查看以下内容:,尤其是“冲突解决”部分。还有以下内容:
Set<String> set = new HashSet<>();
set.add("FB");
set.add("Ea");
set.add("G#");
set.add("FB");
for(String s : set)
System.out.println(s.hashCode());
2236
2236
2236