C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[16656] 스트링 해시함수... 주저리 주저리
김상구.패패루 [peperu] 4284 읽음    2009-08-19 11:58
스트링 해시함수 많이들 쓰시죠?  근데 주로 어떤 함수 사용하시나요?

저는 VCL의 THashedStringList에 포함된 해시 함수나 JAVA 문자열에서 사용하는 해시 함수를 주로 사용하는데 최근 제가 만든 프린터 드라이버의 64비트 포팅 문제 때문에 이것저것 건들다가 든 생각이... 왜 스트링 해시 함수는 다들 byte단위로 계산을 할까? 하는 질문이었습니다.

size_t 단위로 펑 펑 계산해 주는 좋은 해시 함수가 있으면 32비트 환경에선 4배, 64비트 환경에선 최대 8배까지 속도 향상이 있을텐데...

그래서 뭐 간단하게 기존 함수들을 응용해서 DWORD단위, unsigned __int64 단위로 해시를 만들어내는 함수들을 만들어서 여러가지 테스트를 해 보니 거 참... 품질이 별로 좋지 못하네요. 해시 버킷의 수는 제한적일 수 밖에 없기 때문에 상위비트들이 제대로 영향을 못 주는게 당연한지 분포가 고르질 못하네요. 쉬프트도 좀 해 보고 소수 넣어서 이리저리 해 봐도 딱히 만족스러운 해시 함수가 잘 안나옵니다.

시간도 별로 없고 해서 지금은 일단 해시 함수를 교체할 수 있는 구조로 해 놓고 CRC32를 붙여놓긴 했는데 검색용으로 32bit정도 크기의 좋은 해시 값을 만들어 내 주는 고속 해시 함수는 의외로 잘 안보이네요.

역시 해시함수는 수학자들의 몫인가? 하는 생각을 하면서 당장은 보류하고 다음 길을 떠난 패패루였슴다.
이경문 [gilgil]   2009-08-19 12:39 X
음.. 생각해 보니 그렇네요. 아마도 블록 단위로 처리되어야 한다면 기존의 해시 개념이 많이 바뀌어야 해서 그렇지 않을까 싶습니다.예를 들면 파일을 배포하면서 파일의 변경 여부를 확인하기 위해 file md5 검증 과정을 거치는 것이 있는데, 만약 블록 단위로 처리해야 한다면 파일 크기가 n의 배수로 딱 떨어 지지 않는 경우 padding을 해야 할 것이고 이렇게 되면 파일에 대한 해싱 정보의 의미가 조금 더 떨어 지지 않을까요? 정보(파일)의 배포자와 정보(파일)의 수급자가 해싱함수뿐 아니라 블록의 크기, 패딩의 방법까지 다 일일이 약속을 해야 한다면 관리가 더 힘들어 지지 않을까 하는 생각을 해 봅니다.
김상구.패패루 [peperu]   2009-08-19 14:45 X
음... hash의 표준어 표기가 아무래도 해쉬가 아니라 해시인 것 같아서 일단 원문을 수정했습니다.
n배수로 떨어지지 않는건 0를 필요한 만큼 삽입해 n배수로 만들면 되죠. 마치 Base64에서 하는 것 처럼요. 물론 해시의 용도는 다양하고 당연히 자신의 용도에 맞는 적합한 해시 함수를 선택해야겠죠. 동키나 토런트 같은 응용프로그램에선 당연히 중복이 거의 일어나지 않는 긴 bit의 해시를 내 놓는 놈이 좋지만 해시테이블을 구현한다든지 할 때는 어차피 버킷 카운트로 나머지 연산을 해서 사용하는것이 일반적이므로 32bit 안쪽의 골고루 분산되는 해시값이 더 유용하다고 봅니다. 자기가 구현한 해시함수의 성능과 품질이 좋다면 굳이 표준 해시 함수들을 사용할 필요도 없겠죠.

여튼... 남이 해 놓은게 있으면 좀 날로 먹어볼까 했는데 잘 눈에 안 띄네요. ㅋㅋ
김도완 [purplecofe2]   2009-08-21 11:29 X
elf hash는 어떨까요?
김상구.패패루 [peperu]   2009-08-21 12:16 X
ELF 해시함수를 찾아보다 발견한 사이트인데 ELF도 역시 byte단위 계산이네요.
http://www.hello-world.co.kr/?q=node/148
근데 오히려 그 페이지의 맨 마지막에 소개된 SuperFast 알고리즘이 눈에 띕니다.
http://www.azillionmonkeys.com/qed/hash.html
어쩜 이게 제가 찾고 있던거랑 좀 유사할지도 모르겠네요. 속도 테스트 한건 역시나 2~3배정도 빠르네요. 32비트 단위 루프고 16비트씩 짤라서 쉬프트연산으로 상위 하위비트를 섞는 듯 합니다. 나중에 함 테스트 해 보고 결과를 포스팅 하죠.
고맙습니다.
김도완 [purplecofe2]   2009-08-26 11:14 X
ELF Hash 내부에서 32비트로 읽어서 시프트로 1바이트 부분만을 연산에 넣으면 어떨까요?

+ -

관련 글 리스트
16656 스트링 해시함수... 주저리 주저리 김상구.패패루 4284 2009/08/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.