2010-07-23 4 views
4

출력이 캐싱 될 메서드가 있습니다. 네 개의 매개 변수가 필요합니다. , , intWindowsIdentity이다. 이 4 개의 매개 변수를 기반으로 캐시 키를 만들어야합니다. 가장 좋은 방법은 다음과 같습니다.여러 키에서 캐시 키를 작성하는 방법은 무엇입니까?

문자열을 모두 하나로 연결하고 해당 키를 사용합니까? 함께

var key = string.Concat(string1, string2, int1.ToString(), identity.ToString()); 

또는

이 Xor 자신의 해시 코드?

var key = string1.GetHashCode()^string2.GetHashCode()^int1.GetHashCode()^identity.GetHashCode(); 

또는 다른 것? 그게 그렇게 중요한 건가? 내 특별한 경우에,이 키들은 Hashtable (C# v1)으로 갈 것입니다.

답변

8

4 가지 값을 캡슐화하는 새로운 유형을 만듭니다. 예를 들면 :이 가정합니다

public sealed class User 
{ 
    private readonly string name; 
    private readonly string login; 
    private readonly int points; 
    private readonly WindowsIdentity identity; 

    public User(string name, string login, int points, 
       WindowsIdentity identity) 
    { 
     this.name = name; 
     this.login = login; 
     this.points = points; 
     this.identity = identity; 
    } 

    public string Name { get { return name; } } 
    public string Login { get { return login; } } 
    public int Points { get { return points; } } 
    public WindowsIdentity Identity { get { return identity; } } 

    public override bool Equals(object other) 
    { 
     User otherUser = other as User; 
     if (otherUser == null) 
     { 
      return false; 
     } 
     return name == otherUser.name && 
       login == otherUser.login && 
       points == otherUser.points && 
       identity.Equals(otherUser.identity); 
    } 

    public override int GetHashCode() 
    { 
     int hash = 17; 
     hash = hash * 31 + name.GetHashCode(); 
     hash = hash * 31 + login.GetHashCode(); 
     hash = hash * 31 + points.GetHashCode(); 
     hash = hash * 31 + identity.GetHashCode(); 
     return hash; 
    } 
} 

참고 WindowsIdentity 무시 적절하게 EqualsGetHashCode - 또는 참조 유형 평등에 만족 것을.

이 방법은 두 가지 문자열 쌍 "xy", "z"및 "x"에 대한 첫 번째 접근 방식에서와 같이 훨씬 더 강력합니다. "yz"는 동일한 캐시를 형성하게됩니다 키 (int와 identity가 같은 경우), 그렇지 않으면 안됩니다. 두 번째 방법은 심지어 이 우발적 인 해시 충돌을 일으킬 수 있습니다.

0

조회 키의 의미에 맞는 것을 사용하고 프레임 워크는 거기에서 해시/재실행/버킷의 세부 사항을 처리합니다. (사람들은 내가 과거에 이것에 대해 틀렸다는 것을 말해 주었기 때문에 아마 여기서 다시 일어날 것입니다, 우리가 보게 될 것입니다)

2

작은 기회가 있기 때문에 후자에 관해서는 약간 신경이 쓰였습니다. 당신의 열쇠 충돌. 이로 인해 레코드에 대한 잘못된 데이터를 검색 할 수 있습니다 (응용 프로그램의 사용법에 따라 심각한 보안/개인 정보 보호가 적용됨).

키의 주된 목표는 고유해야하므로이 경우를 보장하지 않는 방법을 제거하고 나머지는 최선을 선택하십시오.

+0

을 방지하기 위해 구분 기호를 추가해야합니다 : 당신의 첫번째 생각을 선호 +1 - 3x 기본 필드를 XOR하여 5 %의 충돌/실패율을 초래 한 경우가 발생했습니다. – STW

1

모든 해싱 솔루션이 키 충돌 위험을 감수합니다. XOR은 특히 비참한 해시 알고리즘으로 이것을 보여줍니다. 키 CONCAT 위해,하지만 당신은 경우 ("XY"+ "Z"== "X"+ "YZ")

도 참조 @Caching With Multiple Keys

관련 문제