개인적으로 4 비트의 IP 바이트를 부호없는 long으로 읽는 것이 좋을 것입니다. 그러면 대략 0 - 2^32-1 범위의 수를 얻을 수 있습니다. 그런 다음 한 번에 활성 상태로 만들려는 플로우의 수를 알아 내면 인덱스 테이블 크기가됩니다.
예를 들어 2000을 가져옵니다. 즉, 2^32 숫자를 대략 2^11의 indeces (정보를 전달하기 위해)로 매핑하려고합니다. 100 %로 채워지면 해시가 거의 작동하지 않으며 심지어 90 %가 어려울 수 있기 때문에 해킹이 제대로 작동하지 않습니다. 50 % (4000 indeces) 또는 25 % (8000)까지만 채울 수있는 인덱스 테이블을 사용하면 오늘날의 추억에 별다른 영향을 미치지 않습니다.
인덱스 테이블의 정확한 크기는 고르지 않은 위치 번호 여야하며, 소수점이 바람직합니다. 이는 충돌을 처리하기 위해 오버 플로우 처리 (인덱스 테이블의 동일한 위치에 대한 해싱 포인트 이후의 두 개 이상의 IP 번호)를 처리해야 할 가능성이 높기 때문입니다. 오버플로 처리는 인덱스 테이블 크기보다 작은 다른 소수이어야합니다. 이 모든 소수! 어쨌든 그들과 함께 무엇입니까?
I는 (C)에서 일례로 도시 한 것이다 :
idxsiz = prime(2000 * 2); // 50% loading
ovfjmp = prime(idxsiz/3);
...
처음에 (-1)로 마킹 UNUSED idxjmp 위치의 테이블을 채운다. DELETED 표시를 준비하십시오 (-2).
당신의 IP 번호는 시스템을 입력하고 (또는 존재하지 않을 수있다)의 흐름 기록을 찾습니다
stoppos = ip % idxsiz; /* modulo (division) just this once */
i = stoppos;
do
{
if (index[i] == UNUSED) return NULL;
if (index[i] != DELETED)
{
flowrecptr = &flow_record[index[i]];
if (!flowrecptr->in_use) {/* hash table is broken */}
if (flowrecptr->ip == ip) return flowrecptr;
}
i += ovfjmp;
if (i >= idxsiz) i -= idxsiz;
}
while (i != stoppos);
return NULL;
하지 않는이 인덱스가 사용 된 적이있는 마커 역할을하고 검색이 중지해야 . DELETED는이 색인이 사용되었지만 더 이상 사용되지 않았다는 표시입니다. 즉, 검색을 계속해야 함을 의미합니다.
이것은 얻으려는 시도였습니다. 당신은 UNUSED 나 DELETED가 포함 된 첫 번째 인덱스 위치를 찾음으로써 시작하는 put을 할 필요가 있으므로 get로부터 NULL을 얻을 수 있습니다. 이 값을 flow_record 테이블의 첫 번째/다음 빈 행 인덱스로 대체하십시오. 행을 in_use로 표시하십시오. 원래 IP 번호를 flow_record 행의 ip b 버에 넣으십시오.
이것은 매우 간단하지만 매우 효과적인 해싱 메커니즘을 구성하는 방법입니다. 실질적으로이 함수 나 함수가 실패한 후에 사용되는 특별한 함수 형태의 최적화는 해싱의 효율성을 향상시킵니다.
소수를 사용하면 모든 색인 위치가있는 최악의 경우에 메커니즘이 모든 단일 위치를 테스트합니다. 이를 설명하기 위해 : idxsiz가 ovfjmp로 균등하게 나눌 수 있다고 가정 해 보겠습니다. 오버 플로우 처리가 많지 않습니다. 35 및 7은 인덱스가 0으로 점프되기 전에 테스트되는 위치 0,7,14,21 및 28이되고, while 테스트는 검색을 중지하게합니다.
---------------------- OOPS!
나는 당신이 포트 번호를 원했음을 놓쳤다. ip V4는 6 바이트의 주소를 의미합니다. 이를 부호없는 64 비트 정수로 읽고 상위 16 비트/2 바이트를 지 웁니다. 그런 다음 모듈로 계산을 수행합니다.
그래서 각 ip에 소스 대신 프라임을 곱하면 어떨까요? – creatiwit
해시 함수는'(a * P)^(b * P) = (b * P)^(a * P)'이기 때문에 다시 연관성이 있습니다. 비슷한 일을하기 위해 두 개의 가상 번호가 함께 작동하는 것이 일반적이지만 –