HASH(3)

명칭
hash - hash 데이타베이스 액세스 방식

서식
<sys/types.h> <db.h>

해설
dbopen() routine는, 데이타베이스 파일에의 프로그램 라이브러리 인터페이스입니다. 서포트 대상의 파일 형식의 하나는 hash 파일입니다. 본메뉴얼의 dbopen(3) 에 있는 데이타베이스 액세스 방식의 일반적인 해설은 에 쓰여져 있어 hash 고유의 정보만을 설명하고 있습니다.

hash 데이터 구조는 확장 가능한 동적 해시 schema입니다.

dbopen() 에게 줄 수 있는 액세스 방식 고유의 데이터 구조체는 인클루드 파일 <db.h> 그리고 이하와 같이 정의됩니다.

    typedef struct {
    	u_int bsize;
    	u_int ffactor;
    	u_int nelem;
    	u_int cachesize;
    	u_int32_t (*hash)(const void *, size_t);
    	int lorder;
    } HASHINFO;

이 구조체의 필드는 이하가 됩니다.

bsize
    bsize (은)는, hash 겉(표)의 버킷 사이즈를 정의해, 기본값로 256 바이트입니다. 디스크 상주 테이블과 대형 데이터 항목에 대해서는, 페이지 사이즈를 확대하는 편이 바람직할지도 모릅니다.

ffactor
    ffactor 하 hash 표내의 바람직한 밀도를 표시합니다. 이것은 하나의 버킷내에 누적 가능한 키수의 개산이며, 언제 hash 겉(표)의 확대나 축소를 행해야할 것인가를 결정합니다. 기본값은 8 입니다.

nelem
    nelem 하 hash 겉(표)의 최종 사이즈의 추측치입니다. 미설정 혹은 낮은 값으로 설정되면(자), 몇 안 되는 성능 열화를 볼 수 있다 일지도 모릅니다만, 해시표는 키 입력에 응해 원활히 확장됩니다. 기본값은 1 입니다.

cachesize
    메모리캐슈의 추천 최대 바이트 사이즈입니다. 이 값은 단순한 제언이며, 이 액세스 방식은, 실패하는 것보다는 메모리를 불필요하게 할당하겠지요.

hash
    hash (은)는 유저 정의의 hash 함수입니다. 가능한 데이터 모두에 대해서 동일하게 성능이 좋다 hash 함수는 없기 때문에, 유저는, 편입 hash 함수가 특정 데이터 세트에 충분한 성능이 나오지 않는 것에 깨닫는 일이 있을지도 모릅니다. 유저 지정 hash 함수는 2 개의 인수 (캐릭터 라인에의 포인터로 길이)를 취해, 해시치로서 사용되는 32 비트량을 돌려줍니다.

lorder
    보존된 데이타베이스메타데이타 안의 정수의 바이트 오더입니다. 숫자는 정수로서의 순서를 나타내지 않으면 안됩니다. 예를 들면, 빅 endian의 순서는 4,321 이 됩니다. lorder 하지만 0 (순서 지정 없음)시에는 현행의 호스트의 오더가 사용됩니다. 파일이 미리 존재하고 있으면, 지정치가 무시되어, 트리가 구축되었을 때로 지정된 값이 사용됩니다.

파일이 미리 존재해, (한편 O_TRUNC 플래그가 지정되지 않았다고) , bsize, ffactor, lorder, nelem 의 각 파라미터로 지정된 값은 무시되어 트리의 구축시로 지정된 값이 사용됩니다.

hash 함수가 지정되어 있으면(자), hash_open() (은)는 지정되었다 hash 함수가 데이타베이스 작성시와 같은 것인지를 판별해, 차이가 나면 open 에 실패합니다.

구 dbm 및 구 ndbm routine에의 하위 호환 인터페이스가 제공되고 있습니다만, 이러한 인터페이스는 종래의 파일 포맷과는 호환이 아닙니다.

에러
프로그램 라이브러리 routine dbopen(3) 그리고 지정되어 있는 임의의 에러에 대해, hash 액세스 방식 routine가 실패하면(자), errno (을)를 세트 합니다.

관련 항목
btree(3), dbopen(3), mpool(3), recno(3) Dynamic Hash Tables, Per-Ake Larson, Communications of the ACM, April 1988. A New Hash Package for UNIX, Margo Seltzer, USENIX Proceedings, Winter 1991.

버그
바이트 오더로서 빅 endian와 little endian만이 서포트되고 있습니다.