티스토리 뷰

다음은 샘플 구현입니다.

  class Program {
    static void Main(string[] args) {
          byte[] bytes = new byte[] { 1, 2, 5, 0, 6 };
                byte[] another = new byte[] { 1, 2, 5, 0, 6 };
                
                      Hashtable ht = new Hashtable(new ByteArrayComparer());
                            ht.Add(bytes, "hi");
                                  System.Diagnostics.Debug.Assert(ht.ContainsKey(another));
                                      }
                                      
                                          private class ByteArrayComparer : IEqualityComparer {
                                                public int GetHashCode(object obj) {
                                                        byte[] arr = obj as byte[];
                                                                int hash = 0;
                                                                        foreach (byte b in arr) hash ^= b;
                                                                                return hash;
                                                                                      }
                                                                                            public new bool Equals(object x, object y) {
                                                                                                    byte[] arr1 = x as byte[];
                                                                                                            byte[] arr2 = y as byte[];
                                                                                                                    if (arr1.Length != arr2.Length) return false;
                                                                                                                            for (int ix = 0; ix < arr1.Length; ++ix)
                                                                                                                                      if (arr1[ix] != arr2[ix]) return false;
                                                                                                                                              return true;
                                                                                                                                                    }
                                                                                                                                                        }
                                                                                                                                                          }
                                                                                                                                                          

해시 테이블에 수천 개의 배열을 넣는 경우 더 강력한 해시를 사용해야합니다. 이 게시물 에서 예를 확인하십시오 .

-------------------

기본 유형의 배열이되는 것은 객체 참조를 사용하여 사용해서는 안됩니다.

네, 그래야합니다. 배열은 참조 유형입니다.

모든 것이 예상대로 작동합니다.

다른 동작을 원하는 경우 내용을 비교하고 해시 테이블에 전달하는 배열에 대한 비교기를 구현할 수 있습니다.

-------------------

해시가 일치하지 않기 때문에 false를 반환합니다. GetHashCode ()가 동일한 값에 대해 반복 가능한 해시를 생성하지 않으면 사전에서 작동하지 않습니다.

byte[] bytes = new byte[] { 1, 2, 5, 0, 6 };
byte[] another = new byte[] { 1, 2, 5, 0, 6 };

string astring = "A string...";
string bstring = "A string...";

MessageBox.Show(bytes.GetHashCode() + " " + another.GetHashCode() + " | " + astring.GetHashCode() + " " + bstring.GetHashCode());
-------------------

기본적으로 참조 유형은 해당 유형에 대한 Equals 메서드가 재정의되지 않은 경우 해당 참조로 비교됩니다.

참조 형식을 has 테이블의 키로 사용하려면 GetHashCode 메서드도 재정 의하여 '동일한'개체가 동일한 해시 코드를 생성하도록해야합니다.

해시 테이블은 GetHashCode 메서드를 사용하여 해시를 계산하여 개체를 저장하며 이후의 '적중'은이를 사용하여 계산됩니다. 개체의 각 속성 (귀하의 경우 배열의 각 바이트)에 대해 GetHasshCode에서 반환 한 값을 기준으로 할 수 있습니다. 이것은 해시 테이블에서 사용할 수있는 IEqualityComparer에서도이 작업을 수행 할 수 있습니다.

 public override int GetHashCode() {
        int hash = 17;
          hash = hash * 23 + DrillDownLevel.GetHashCode();
            hash = hash * 23 + Year.GetHashCode();
            
              if (Month.HasValue) {
                  hash = hash * 23 + Month.Value.GetHashCode();
                    }
                    
                      if (Week.HasValue) {
                          hash = hash * 23 + .Week.Value.GetHashCode();
                            }
                            
                              if (Day.HasValue) {
                                  hash = hash * 23 + obj.Day.Value.GetHashCode();
                                    }
                                    
                                      return hash;
                                      }
                                      


출처
https://stackoverflow.com/questions/1905038
댓글
공지사항
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31