해시 함수 출력이 블룸 필터 인덱스에 매핑되는 방법에 대한 개요를 제공하여 도움을받을 수 있습니까? bloomfilters에 대한 개요는 다음과 같습니다.hashfunction 출력을 bloomfilter 인덱스에 매핑하는 방법은 무엇입니까?
답변
해시 함수의 출력은 피어 필터 인덱스 사용되는 K 해시 기능별
에 매핑되는 방법을 개략적 그들은 블룸 필터만큼의 비트에 맵핑 해시는 해시 테이블의 해시 버킷에 매핑됩니다. 따라서 일반적으로 32 비트 정수를 생성하는 해시 함수를 말한 다음 계수 %
을 사용하여 비트 인덱스 0 << i < n
을 얻습니다. 여기서 n
은 블룸 필터의 비트 수입니다.
int bit_index = hash_function(input_value) % 1000;
그것은 여기에 2 점에 유의하는 것이 중요합니다^32-1은 1000보다 훨씬 큽니다. 대신 해시 함수가 상당히 균등하게 분산 된 숫자를 생성했지만 0과 1023 사이의 숫자 만 생성하면 모듈러스 연산 후에 bit_index가 0..23에 두 배가 될 것입니다 (예를 들어, 입력 2와 1002 모두 포스트 모듈러스 값 2가되지만 입력 값 25 만 25가 출력되기 때문에). 이러한 이유로 32 비트를 생성하는 해시 함수가있는 경우 블룸 필터를 사용하여 2의 거듭 제곱 수의 크기로 블룸 필터를 사용하고 해시 값의 섹션을 슬라이스하여 독립 해시 함수처럼 사용할 수 있습니다 - 당신이 링크하는 위키피디아 기사에서 모두 설명했습니다. 해시 함수의 "클러스터링"결함은 그대로 출력을 통해 전달되므로 양질의 해시 함수가 필요합니다. 소수 비트를 갖는 것은 가난한 해싱을 완화하는 한 가지 방법입니다. 그럼에도 불구하고 좋은 해시 함수를 사용하면 2의 제곱으로 비트 연산을 사용하여 비트 인덱스를 쉽게 추출 할 수 있습니다. 필요한 경우 비트 모듈을 빠르게 변환 할 수 있습니다. 그러나 해시 함수는 전반적인 성능 프로파일 실제로 특히 나쁜
BOOST_STATIC_ASSERT(MD5_DIGEST_LENGTH >= sizeof(int));
int bit_index = *reinterpret_cast<unsigned int*>(p) % num_of_bloom_filter_bits;
했다 : -
을 편집 MD5 기능의 데이터의 MD5_DIGEST_LENGTH
바이트에 unsigned char*
"P"를 반환 가정 주소 코멘트 ...
, 난 당신이 시도 제안 아이디어 - 죄송합니다 - 나는 왜 그 순간 두 가지 이유를 설명 할 것입니다. 먼저, 무엇을하는지에 대한 질문에 대답하기 위해 : BOOST_STATIC_ASSERT()
은 전달 된 표현식이 false
으로 평가되면 컴파일 오류를 제공하도록 설계되었습니다. 여기에 기본적으로 MD5 해시 텍스트의 문자 크기 인 MD5_DIGEST_LENGTH
은 최소한 int
정수 유형에 대해 시스템에서 사용하는 바이트 수만큼이어야한다는 요구 사항을 문서화하는 방법입니다. (그 크기는 아마 4 바이트이지만 8 일 수도 있습니다.)이 요구 사항은 다음 줄의 reinterpret_cast
이 안전한지 확인하기위한 것입니다. MD5 해시의 텍스트 표현의 시작 부분에있는 바이트의 값을 읽은 것처럼 그 바이트에 int
이있는 것처럼 읽습니다. 따라서 int
크기가 인 경우 4이며 MD5 해시는 댓글에서와 같이 "0cc175b9c0f1b6a831c399e269772661"입니다. 첫 번째 4 바이트는 "0cc1"입니다. 해당 텍스트의 ASCII 코드는 48, 99, 99, 49 십진수입니다.그들이 int
으로 읽혀질 때, CPU의 엔디안에 따라 값은 다를 수 있지만, 기본적으로 256 * 3과 256 * 2에 세 번 더하기 256을 더한 숫자 중 하나를 얻을 것입니다 번호.
- 는 MD5 문자열의 각 문자는 두 숫자 (ASCII 코드 48-57) 또는 "A"를 통해 "F"편지입니다 :
이유는 나는이 특히 나쁜 생각은했다 (97-102). 이 16 개의 값은 한 바이트가 가질 수있는 변형의 16 번째이며, 생성하는
int
값은 32 비트를 차지하지만 실제로는 2^16 개의 고유 값을 갖습니다. - 일부 컴퓨터에서는
int
이 2, 4, 8 등의 배수 인 메모리 주소에 정렬되어야합니다.reinterpret_cast
- 호환되지 않는 주소에서 텍스트가 시작될 경우 컴퓨터가 중단 될 수 있습니다. 참고 : Intel & AMD는 정렬 요구 사항이 없지만 올바르게 정렬 된 데이터에서 작동하는 것이 더 빠를 수 있습니다.
그래서, 또 다른 제안은 다음의 MD5 표현이 데이터 버퍼보다 짧았다 경우 BOOST_STATIC_ASSERT이 필요하지 않도록
다음// create a buffer of the right size to hold a valid unsigned long in hex representation...
char data[sizeof(unsigned long) * 2 + 1];
// copy as much of the md5 text as will fit into the buffer, NUL terminating it...
sprintf(data, "%.*s", sizeof data - 1, md5);
// convert to an unsigned long...
m = strtoul(data, /*endptr*/ NULL, /*base*/ 16);
, 그것은 단지 초기 부분은 안전하게 복사 할 수있다.
비 암호화 해시 함수를 사용하는 것이 훨씬 쉽습니다. 일반적으로 숫자의 readble 텍스트 버퍼 표현이 아닌 숫자를 반환하기 때문에 모든 넌센스를 피할 수 있습니다.
- 1. thread-safe bloomfilter
- 2. 데이터베이스를 매핑하는 방법은 무엇입니까?
- 3. IntelliJ에서 파일을 매핑하는 방법은 무엇입니까?
- 4. 컴포지션 관계를 매핑하는 방법은 무엇입니까?
- 5. nhibernate에서 인터페이스를 매핑하는 방법은 무엇입니까?
- 6. ModelAttribute의 속성을 매핑하는 방법은 무엇입니까?
- 7. 출력을 리디렉션하는 방법은 무엇입니까?
- 8. 인덱스에 축소판을 하나만 표시하는 방법은 무엇입니까?
- 9. 출력을 파일에 추가하는 방법은 무엇입니까?
- 10. varnishtop의 출력을 읽는 방법은 무엇입니까?
- 11. sed 출력을 뒤집는 방법은 무엇입니까?
- 12. printf의 출력을 캡처하는 방법은 무엇입니까?
- 13. 프로세스의 출력을 얻는 방법은 무엇입니까?
- 14. ncval의 출력을 해석하는 방법은 무엇입니까?
- 15. 콘솔보기의 출력을 숨기는 방법은 무엇입니까?
- 16. Json 출력을 포맷하는 방법은 무엇입니까?
- 17. Spork 출력을 정리하는 방법은 무엇입니까?
- 18. jQuery 출력을 배치하는 방법은 무엇입니까?
- 19. FluentNibernate에서 개인 ID 필드를 매핑하는 방법은 무엇입니까?
- 20. automapper에서 날짜에 문자열을 매핑하는 방법은 무엇입니까?
- 21. Castor : 간단한 문자열 목록을 매핑하는 방법은 무엇입니까?
- 22. Jetty에서/*에 서블릿 필터를 매핑하는 방법은 무엇입니까?
- 23. datagridview의 rowId에 datatable의 인덱스를 매핑하는 방법은 무엇입니까?
- 24. 원래 파일 이름으로 GUID를 매핑하는 방법은 무엇입니까?
- 25. ASP.NET MVC3에서 리소스 경로를 매핑하는 방법은 무엇입니까?
- 26. automapper를 사용하여 두 엔티티를 매핑하는 방법은 무엇입니까?
- 27. nhibernate에서 외래 키 열을 매핑하는 방법은 무엇입니까?
- 28. 이 클래스들을 Hibernate로 매핑하는 방법은 무엇입니까?
- 29. vsnet에서 control-f를 다시 매핑하는 방법은 무엇입니까?
- 30. 브라우저의 URL보기를 특정 이름으로 매핑하는 방법은 무엇입니까?
32 비트를 출력하는 MD5 해시 함수를 사용하면 블룸 필터의 인덱스를 어떻게 얻을 수 있습니까? MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661이라고 가정하면, 여기에서 어떻게 실제로 정수 인 bitindex를 얻을 수 있습니까? – MiNdFrEaK
MD5 함수가'MD5_DIGEST_LENGTH' 바이트의 데이터에'unsigned char *'''p' "를 반환한다고 가정하면 BOOST_STATIC_ASSERT (MD5_DIGEST_LENGTH = sizeof (int));를 시도 할 수 있습니다. int bit_index = * reinterpret_cast <부호없는 int *> (p) % num_of_bloom_filter_bits;'. –
별도로 - MD5는 과장 될 수 있습니다. http://www.partow.net/programming/hashfunctions/index.html (C++ 구현이 링크 된 상태)에서 설명 된 일부 더 간단하고 빠른 알 고리가 있지만 다른 곳에서 권장되었지만 개인적으로 사용했다. –