Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- dfs
- 코딩일기
- Typescript
- 백준
- c++
- TS
- react-native
- bfs
- 알고리즘
- DP
- 이것이코딩테스트다
- 개발자북클럽
- 최단경로
- BOJ
- 백준온라인저지
- 이코테
- 타입스크립트
- 코딩테스트
- SQL
- 다이나믹프로그래밍
- 그리디
- 정렬
- 이진탐색
- 코테
- ps
- 구현
- 앱개발
- 노마드코더
- 빅데이터분석
- 프로그래머스
Archives
- Today
- Total
한량처럼 살고 싶다
IDS 프로젝트 - 정수로 된 IP주소를 해싱 본문
C언어의 포인터는 뭐든지 될 수 있다 거의 메타몽급
크기가 넘어가지만 않으면 (넘어가도 ㄱㅊ긴 함 거기에 머가 있는지 알고만 있다면... 이상한 메모리 터치하면 죽을 수도 있음)
이 점을 이용해서 ip주소를 해싱하고 해시테이블의 키로 이용해봅시다
일단 리눅스에 있는 해싱 함수를 살짝 가져다가 내 입맛대로 자료형만 조금 바꿔주었다
원랜 sha256()을 썼는데, 32바이트가 반환되니 이걸 정수로 다시 바꾸기가 애매했다.
/*
* Ozan Yigit's original sdbm hash.
*
* Ugly, but fast. Break the string up into 8 byte units. On the first time
* through the loop get the "leftover bytes" (strlen % 8). On every other
* iteration, perform 8 HASHC's so we handle all 8 bytes. Essentially, this
* saves us 7 cmp & branch instructions.
*
*/
uint32_t hash_func4 (const char *key, int len) { //ub8 이 unsigned 8비트 char
const char *k;
unsigned int n, loop;
if (len == 0)
return (0);
#define HASHC n = *k++ + 65599 * n
n = 0;
k = key;
loop = (len + 8 - 1) >> 3;
switch (len & (8 - 1)) {
case 0:
do {
HASHC;
case 7:
HASHC;
case 6:
HASHC;
case 5:
HASHC;
case 4:
HASHC;
case 3:
HASHC;
case 2:
HASHC;
case 1:
HASHC;
} while (--loop);
}
return (n);
}
uint32_t hashSrcIp (unsigned int srcip) {
return hash_func4((const char *)&srcip, sizeof(srcip));
}
srcip의 주소를 const char *로 형변환하여 hash_fun4()의 key로 넣어주고, 크기는 sizeof()로 해주면 된다.
실제로 해시함수 만드신 분의 주석에 이렇게 적혀있다
>>Ugly, but fast <<
하지만 빨랐죠?
'C C++ > IDS 개발 - C' 카테고리의 다른 글
C언어 해시테이블 구현 (3) | 2024.04.25 |
---|---|
IDS 프로젝트 - MAKEFILE 작성하기 (0) | 2024.04.22 |
IDS 프로젝트 - 개발 후 유용하게 사용한 함수와 구조체 정리 (0) | 2024.04.19 |