www.pudn.com > src.rar > hash.c
#include#ifdef WIN32 #include #include #include "nids.h" #else #include #endif #include #include #include #include #ifdef WIN32 long random(); void srandom(unsigned int); #endif static u_char xor[12]; static u_char perm[12]; static void getrnd () { struct timeval s; u_int *ptr; int fd = open ("/dev/urandom", O_RDONLY); if (fd > 0) { read (fd, xor, 12); read (fd, perm, 12); close (fd); return; } gettimeofday (&s, 0); #ifdef WIN32 srandom (s.tv_usec); ptr = (u_int *) xor; *ptr = random (); *(ptr + 1) = random (); *(ptr + 2) = random (); ptr = (u_int *) perm; *ptr = random (); *(ptr + 1) = random (); *(ptr + 2) = random (); #else srand (s.tv_usec); ptr = (u_int *) xor; *ptr = rand (); *(ptr + 1) = rand (); *(ptr + 2) = rand (); ptr = (u_int *) perm; *ptr = rand (); *(ptr + 1) = rand (); *(ptr + 2) = rand (); #endif } void init_hash () { int i, n, j; int p[12]; getrnd (); for (i = 0; i < 12; i++) p[i] = i; for (i = 0; i < 12; i++) { n = perm[i] % (12 - i); perm[i] = p[n]; for (j = 0; j < 11 - n; j++) p[n + j] = p[n + j + 1]; } } u_int mkhash (u_int src, u_short sport, u_int dest, u_short dport) { u_int res = 0; int i; u_char data[12]; *(u_int *) (data) = src; *(u_int *) (data + 4) = dest; *(u_short *) (data + 8) = sport; *(u_short *) (data + 10) = dport; for (i = 0; i < 12; i++) res = ( (res << 8) + (data[perm[i]] ^ xor[i])) % 0xff100f; return res; }