2011-10-12 3 views
1

스칼라에는 세 세트의 문자열이 있다고 가정합니다. 하나에는 A, B, C 요소가 있습니다. 두 요소에는 B, C, D 요소가 있습니다. 그리고 세 가지는 원소 J, K, I를 가지고 있습니다.스칼라 세트 해시 코드

첫 번째 질문은이 두 세트의 해시 코드가 동일 할 수있는 방법이 있습니까? 두 번째 질문은 D를 One에 추가하고 A to Two를 새로 설정하면 One.n과 Two.n은 One.n과 Two.n에 대한 해시 코드입니까?

+5

REPL을 3 분만 사용하면 질문의 절반에 답변 할 수 있습니다. –

답변

6

질문 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 

그래서, 그래 그들은이다.

+0

질문하기에 앞서, 나는 그것을 시도했습니다. 나는 말했어 야했다. "... 하나 둘. 항상 같았 어?" 여전히 불변인가? – user592419

+3

'hashCode'에 대한 규칙은 : 만약 당신의 객체'a','b'가 동일하다면, 즉'a.equals (b)'이면'a.hashCode == b.hashCode' (그러나 다른 방법으로). – Dirk

+0

@ user592419 그렇습니다. 그러나 해시 코드는 지정된 공용 클래스 멤버가 아닌 implentation 세부 정보이므로이 매개 변수에 의존하지 않아야합니다. 예 : hashCode 메소드를 오버라이드 (override) 해, 난수를 돌려주는 서브 클래스를 작성할 수 있습니다. –

2

내부적으로 이상한 (즉, 불안정한 해시 코드가 있거나 해시 코드가 equals와 일치하지 않는) 세트는 동일한 해시 코드를 가져야합니다. 이것이 사실이 아니며 세트가 동일한 유형의 세트 인 경우 이는 버그이므로보고해야합니다. 세트가 다른 세트의 세트 인 경우는, 다른 해시 코드를 가지는 버그 일지 어떨지는 모른다 (어느 쪽의 경우에서도, equals와 동의 할 필요가있다). 그러나 다른 세트 구현이 동일하지 않은 경우 (예 : 변경 가능 BitSet조차도 불변 Set와 일치 함)에 대해서는 알지 못합니다.

그래서 :

  1. 해시 코드입니다 결코 고유합니다,하지만 충돌의 가능성이
  2. 세트
  3. 해시 코드는 항상 equals와 일관성이 있어야 낮은 것을 잘 분산되어야한다 (당신이 세트에 넣은 모든 것이 equals와 일치하는 hashCode를 가짐) 같은 세트가 동일한 해시 코드를 갖는다는 점에서 다릅니다. (반대는 (1) 때문에 사실이 아닙니다.)
  4. 집합에 추가 순서가 아닌 내용의 신원에 대해서만주의를 설정합니다. 즉 집합, 예를 들어 목록)
+0

Point 2 not quite : equals가 true 인 경우 해시 코드는 항상 equals와 만 일치합니다. 같음은 거짓이지만 해시 코드는 같을 수 있습니다. –

+0

@LuigiPlinge - 그게 내가 전하고자 한 것입니다. 나는 그 말씨를 고칠 것이다. –