2012-10-28 5 views
1

this website에 정의 된 로직을 구현하려고합니다. 여러 (100-200) 부호의 int 문자열을 여러 (100-200) 부호없는 정수로 해시

  • 해시 각 서버 문자열을하지만 난 이것에 혼란 스러워요 : 단계 중 하나입니다. 아무도 내가 논리를 수동으로 구현할 수 있도록이 의미가 무엇인지 말해 주시겠습니까?

    // This count is always 2 as per my current setup 
    int availableservers = Client.getAvailableServers().size(); 
    
    String key = "MyKey"; 
    int keyid = key.hashCode(); 
    int v = keyid % 1; 
    String valess = (String) mcc.get(key,v); 
    
+0

이것은 자바 질문을 좋아하지 않습니다. 내가 해석 할 수있는 한 강조하는 부분은 해시를 만드는 것을 의미합니다. MD5 체크섬과 같은 것입니다. [Hashing] (http://en.wikipedia.org/wiki/Hash_function)을 살펴보십시오. – asgs

답변

2

나는 케냐 해시가 MD5를 사용하여 계산 된 것 같습니다.

svn://svn.audioscrobbler.net/misc/ketama/

여기에서, 그들은 자바 구현을 포함 한 것으로 나타납니다 : 나는 당신이 언급 한 기사가 자신의 SVN 코드베이스에 대한 링크를 포함 here

public static Long md5HashingAlg(String key) { 
    MessageDigest md5 = null; 
     try { 
      MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      throw new IllegalStateException("md5 algorythm found");    
     } 
    } 
    md5.reset(); 
    md5.update(key.getBytes()); 
    byte[] bKey = md5.digest(); 
    long res = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8) | (long)(bKey[0]&0xFF); 
    return res; 
} 
3

샘플 구현을 발견

svn://svn.audioscrobbler.net/misc/ketama/java_ketama/SockIOPool.java

코드에서 다음을 찾을 수 있습니다.

for(long j = 0; j < factor; j++) { 
    byte[] d = md5.digest((servers[i]+"-"+j).getBytes()); 
    for(int h=0;h<4;h++) { 
    Long k = 
     ((long)(d[3+h*4]&0xFF) << 24) 
     | ((long)(d[2+h*4]&0xFF) << 16) 
     | ((long)(d[1+h*4]&0xFF) << 8) 
     | ((long)(d[0+h*4]&0xFF)); 
    buckets.put(k, servers[i]); 
    log.debug("++++ added " + servers[i] + " to server bucket"); 
    }    
} 

이 코드는 각 서버에 대해 총 factor 개의 해시를 생성합니다. 해시 (hashing) 전에 문자열 server[i]j의 현재 값을 추가하는 for 루프에 주목하십시오.

Frank Pavageau의 답변과 결합하면 곧 어떤 일이 일어나는지 이해해야합니다.

+0

그 링크를 가져 주셔서 감사합니다, 그것을 기반으로 구현하는 데 유용했지만 매우 혼란스러워 보입니다. – Pawan

1

Duncan이 맞습니다. 소스를 확인하여 특정 구현이 어떻게 작동하는지 확인하십시오.

는 동일한 키에 따라 여러 해시를해야하는 경우, 개념적으로, 해시 알고리즘을 사용하든, 당신이 오직 할 필요가있는 몇 가지 "상수"로 키를 연결하여, 또는 적어도 알려진 반복 값 :

그리고 이는 기사의 용어를 다시 사용하기 위해 정수 "연속체"주위에 해시를 배포하는 것과 같습니다. 그래서 당신은 hashCode()를 구현하는 것과 같은 방법으로 그렇게 할 수 있습니다 :

String key "MyKey"; 
List<Integer> hashes = new ArrayList<>(); 
int hash = key.hashCode(); 
for (int i = 0; i < 100; i++) { 
    hashes.add(hash); 
    hash = 31 * hash + 1234567; 
} 
+0

고마워 프랭크 Pavageau,하지만이 ketama 해싱 기법과 동일하지 않습니다 같아요 – Pawan

+0

그것은 동일한 구현되지 않을 수도 있습니다,하지만 괜찮아요 : 가능한 "int 값을 통해 확산"해시 "의 숫자를 생성합니다. –

관련 문제