코드 냄새 167 - 해싱 비교

해싱은 두 개체가 서로 다른 것을 보장합니다. 그들이 같은 것은 아닙니다

TL;DR: If you check for the hash, you should also check for equality



문제




  • 솔루션


  • 해시(빠름)를 확인한 다음 같음(느림)을 확인합니다

  • 문맥



    2022년 10월 7일에 더 큰 블록체인 중 하나가 중단되어야 했습니다.

    This news은 대부분의 블록체인이 정의상 탈중앙화되어 있기 때문에 충격적이었습니다.

    여기에서 전체 기사를 읽을 수 있습니다.




    샘플 코드



    잘못된




    public class Person {
    
    public String name;
    // Public attributes are another smell  
    
     @Override
     public boolean equals(Person anotherPerson) {
       return name.equals(anotherPerson.name); 
     }
    
    @Override
     public int hashCode() {
       return (int)(Math.random()*256); 
     }
     // This is just an example of non correlation  
    
     // When using HashMaps we can make a mistake 
     // and guess the object is not present in the collection
    
    }
    

    오른쪽



    public class Person {
    
    public String name;
    // Public attributes are another smell  
    
     @Override
     public boolean equals(Person anotherPerson) {
       return name.equals(anotherPerson.name); 
     }
    
    @Override
     public int hashCode() {
       return name.hashCode(); 
     }
     // This is just an example of non correlation  
    
    }
    

    발각



    [X] 반자동

    많은 린터에는 해시 및 평등 재정의에 대한 규칙이 있습니다.

    돌연변이 테스트를 통해 동일한 해시로 다른 개체를 시드하고 테스트를 확인할 수 있습니다.
  • 아이덴티티
  • 보안

  • 결론



    모든 성능 향상에는 단점이 있습니다.

    캐시와 복제가 주목할만한 예입니다.

    우리는 그것들을 조심스럽게 사용할 수 있습니다.

    처지











    더 많은 정보



    Equality and Hash

    Hashcode in Java

    Hashcode vs Equal

    부인 성명



    코드 냄새는 그냥 내 .


    This will surprise some of your readers, but my primary interest is not with computer security. I am primarily interested in writing software that works as intended.



    비에체 베네마






    이 기사는 CodeSmell 시리즈의 일부입니다.


    좋은 웹페이지 즐겨찾기