스칼라에는 세 세트의 문자열이 있다고 가정합니다. 하나에는 A, B, C 요소가 있습니다. 두 요소에는 B, C, D 요소가 있습니다. 그리고 세 가지는 원소 J, K, I를 가지고 있습니다.스칼라 세트 해시 코드
첫 번째 질문은이 두 세트의 해시 코드가 동일 할 수있는 방법이 있습니까? 두 번째 질문은 D를 One에 추가하고 A to Two를 새로 설정하면 One.n과 Two.n은 One.n과 Two.n에 대한 해시 코드입니까?
스칼라에는 세 세트의 문자열이 있다고 가정합니다. 하나에는 A, B, C 요소가 있습니다. 두 요소에는 B, C, D 요소가 있습니다. 그리고 세 가지는 원소 J, K, I를 가지고 있습니다.스칼라 세트 해시 코드
첫 번째 질문은이 두 세트의 해시 코드가 동일 할 수있는 방법이 있습니까? 두 번째 질문은 D를 One에 추가하고 A to Two를 새로 설정하면 One.n과 Two.n은 One.n과 Two.n에 대한 해시 코드입니까?
질문 1) 일반적으로 예, 전적으로 가능합니다. 해시 코드는 제한된 길이의 바이트입니다. 세트는 모든 크기가 될 수 있습니다. 따라서 해시 코드는 고유 할 수는 없지만 일반적으로 고유합니다.
질문 2) 사용해 보지 않으시겠습니까? 당신이 ==
방법은이 두 인스턴스에 대한 사실 기대하기 때문에 당신이 예상대로
scala> val One = collection.mutable.Set[String]("A", "B", "C")
One: scala.collection.mutable.Set[String] = Set(A, B, C)
scala> One.hashCode
res3: Int = 1491157345
scala> val Two = collection.mutable.Set[String]("B", "C", "D")
Two: scala.collection.mutable.Set[String] = Set(B, D, C)
scala> Two.hashCode
res4: Int = -967442916
scala> One += "D"
res5: One.type = Set(A, B, D, C)
scala> Two += "A"
res6: Two.type = Set(B, D, A, C)
scala> One.hashCode
res7: Int = -232075924
scala> Two.hashCode
res8: Int = -232075924
그래서, 그래 그들은이다.
질문하기에 앞서, 나는 그것을 시도했습니다. 나는 말했어 야했다. "... 하나 둘. 항상 같았 어?" 여전히 불변인가? – user592419
'hashCode'에 대한 규칙은 : 만약 당신의 객체'a','b'가 동일하다면, 즉'a.equals (b)'이면'a.hashCode == b.hashCode' (그러나 다른 방법으로). – Dirk
@ user592419 그렇습니다. 그러나 해시 코드는 지정된 공용 클래스 멤버가 아닌 implentation 세부 정보이므로이 매개 변수에 의존하지 않아야합니다. 예 : hashCode 메소드를 오버라이드 (override) 해, 난수를 돌려주는 서브 클래스를 작성할 수 있습니다. –
내부적으로 이상한 (즉, 불안정한 해시 코드가 있거나 해시 코드가 equals와 일치하지 않는) 세트는 동일한 해시 코드를 가져야합니다. 이것이 사실이 아니며 세트가 동일한 유형의 세트 인 경우 이는 버그이므로보고해야합니다. 세트가 다른 세트의 세트 인 경우는, 다른 해시 코드를 가지는 버그 일지 어떨지는 모른다 (어느 쪽의 경우에서도, equals와 동의 할 필요가있다). 그러나 다른 세트 구현이 동일하지 않은 경우 (예 : 변경 가능 BitSet조차도 불변 Set와 일치 함)에 대해서는 알지 못합니다.
그래서 :
Point 2 not quite : equals가 true 인 경우 해시 코드는 항상 equals와 만 일치합니다. 같음은 거짓이지만 해시 코드는 같을 수 있습니다. –
@LuigiPlinge - 그게 내가 전하고자 한 것입니다. 나는 그 말씨를 고칠 것이다. –
REPL을 3 분만 사용하면 질문의 절반에 답변 할 수 있습니다. –