해시 충돌로 인해 HashSet이 안전합니다 [중복]
Nov 24 2020
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
내 질문은 항상 해시 충돌을 처리하고 해시가 정확히 동일하면 객체가 다르다는 것을 정확히 어떻게 알 수 있습니까? 그들은 같음을 확인하고 그렇지 않으면 해싱 지점을 무너 뜨립니다.
문자열에 해시 세트를 사용하면 내가 만들고있는 프로그램에 대한 해시 충돌이 거의없는 sha256과 비교하면 문제가 발생하고 String.hashCode ()가 서로 충돌 할 가능성은 얼마나됩니까? contains 및 add 메서드가 모두 해시를 확인하지 않는 경우 왜 해시를 사용하고 있습니까?
답변
tentacle Nov 24 2020 at 15:59
동일 해시 코드는 객체가 동일하다는 것을 의미하지 않습니다. 컬렉션 계약에 따르면 두 개체가 같으면 해시 코드가 같아야하며 그 반대의 경우도 마찬가지입니다.
set 및 map과 같은 컬렉션의 개체에 해시 충돌이 있는지는 실제로 중요하지 않으며 equals 메서드가 개체를 구별 할 수 있을 때까지 제대로 작동 합니다. 모든 해시가 동일하면 세트가 목록으로 효과적으로 저하되기 때문에 성능이 저하 될 수 있습니다.