2010-04-24 2 views
6

해시 범위 (md5 또는 sha1)를 n 개의 동등한 범위로 분할하려고합니다. 전체 해시 범위를 균등 범위로 분할

예를 들어, m (num 노드) = 5 인 경우 전체 해시 범위가 5로 나뉘어 키 범위의 균일 한 분포가있게됩니다. 나는 n = 1 (노드 1)이 해시 범위의 시작에서 1/5로, 2가 1/5에서 2/5로 끝까지 끝나길 원합니다.

기본적으로 각 해시에 값을 해시 할 때 n이 해당 범위를 관리한다는 것을 알기 위해 각 범위에 키 범위를 매핑해야합니다.

저는 해시가 처음이고 프로젝트에서이 문제를 해결할 수있는 곳이 어디인지 알지 못합니다. 당신이 줄 수있는 어떤 도움도 위대 할 것입니다.

+0

n을 사용하는 방법 혼란 ... 큰 정수를 지원하는 방법에 의해 파이썬 코드, 모두로 분할하고, 그 중 하나에 대한 인덱스로하는 범위의 수 n 부분. – Joren

+0

이 모든 질문은 혼란스럽고, 암호화 해시 기능이 효과적으로 되돌릴 수 없기 때문에 무엇을하려고하든, 무엇을하려하든 불가능하다고 생각합니다. –

+0

나는 모호한 n의 사용을 고치고 조금 더 설명하려고하는 질문에 대해 바 꾸었습니다. – noxtion

답변

1

바이어스를 제거하기 위해 약간 힘들 수 있다면 (2의 거듭 제곱은 5로 균등하게 나눌 수 없기 때문에 약간의 편견이 있어야합니다.) 그런 다음 모듈로 (% 및 C- like 구문)은 전체 범위를 5 개의 거의 동일한 크기의 파티션으로 나누는 방법입니다.

md5(m)%5==0m가 첫 번째 파티션에있는 모든 메시지 등

0

당신이 균등 한 후 몇 가지 간단한 수학 트릭을 할 것 "버킷"의 번호로 해시 가치를 찾고 있다면. 반올림 가장자리의 경우주의하십시오. 버킷 값에 2의 제곱을 사용하는 것이 좋습니다.

BUCKETS = 5 
BITS  = 160 

BUCKETSIZE = 2**BITS/BUCKETS 

int('ad01c5b3de58a02a42367e33f5bdb182d5e7e164', 16)/BUCKETSIZE == 3 
int('553ae7da92f5505a92bbb8c9d47be76ab9f65bc2', 16)/BUCKETSIZE == 1 
int('001c7c8c5ff152f1cc8ed30421e02a898cfcfb23', 16)/BUCKETSIZE == 0