본문 바로가기
Computer Science

Generic Hash 2

by OKOK 2021. 4. 29.

1000, 1096 % 8 은

2진수로 하였을 때 뒷자리 3개로 결정하게 됨.

pid를 8개의 버킷으로 분리하겠다는 의미임.

 

그럼 항상 저 GOLDEN_RATIO_PRIME_32 를 사용해서 hash 값을 구하면 좋은 것인가?

언제 사용 할 수 있는지.

#include <stdio.h>

#define GOLDEN_RATIO_PRIME_32 0x9e370001UL


int main()
{
	unsigned long long hash = 3 * GOLDEN_RATIO_PRIME_32;
	printf("%llu\n%lu", hash, GOLDEN_RATIO_PRIME_32);

	long long var = 0x1234567812345678;
	printf("\n%llu", var);
	return 0;
}

 

#include <stdio.h>
#include <stdlib.h>

struct hlist_head {
	struct hlist_node* first;
};

struct hlist_node {
	struct hlist_node* next, ** pprev;
};

void hlist_add_head(struct hlist_node* n, struct hlist_head* h)
{
	struct hlist_node* first = h->first;
	n->next = first;
	if (first)
		first->pprev = &n->next;
	h->first = n;
	n->pprev = &h->first;
}

/*
#define offsetof(TYPE, MEMBER)	((size_t)&((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                      \
	const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
	(type *)( (char *)__mptr - offsetof(type,member) );})
//-------------------------------------------------
*/
#define container_of(ptr, type, member) (type*)((char*)ptr - (unsigned long long)&((type*)0)->member)

#define  HASH_MAX   8

#define GOLDEN_RATIO_PRIME_32 0x9e370001UL

unsigned int hash_32(unsigned int val, unsigned int bits)
{
	unsigned int hash = val * GOLDEN_RATIO_PRIME_32;
	return hash >> (32 - bits);
}

#define pid_hashfn(pid)  \
	    hash_32( pid, 3 )    

typedef struct
{
	int sno;
	struct hlist_node hash;
} SAWON;

int hash_sno(int sno)
{
	return hash_32(sno, 3);
}

void display(struct hlist_head* heads)
{
	int i;
	struct hlist_node* temp;
	SAWON* s;
	system("clear");
	for (i = 0; i < HASH_MAX; i++)
	{
		printf("[%d]", i);
		for (temp = heads[i].first; temp; temp = temp->next)
		{
			s = container_of(temp, SAWON, hash);
			printf("<->[%d]", s->sno);
		}
		printf("\n");
	}
	getchar();
}

int main()
{
	struct hlist_head heads[HASH_MAX] = { 0, };
	SAWON s[30] = { 0, };
	int i;
	int sno;

	display(heads);
	for (i = 0; i < 30; i++)
	{
		sno = 1000 + i;
		s[i].sno = sno;
		hlist_add_head(&s[i].hash, &heads[hash_sno(sno)]);
		display(heads);
	}
	return 0;
}

'Computer Science' 카테고리의 다른 글

Interval Tree  (0) 2021.04.30
증강 트리  (0) 2021.04.30
Generic Hash 타입 설계  (0) 2021.04.29
Generic Hash  (0) 2021.04.29
최신 매크로 분석 container_of  (0) 2021.04.29

댓글