zoukankan      html  css  js  c++  java
  • libnids 中哈希表的建立

    //hash.c

    #include <sys/types.h>
    #include <sys/time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>


    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); //在urandom读取12个随机数
      if (fd > 0)
        {
          read (fd, xor, 12);
          read (fd, perm, 12);
          close (fd);
          return;
        }
    //随机数读取成功返回,不会执行以下代码。
      gettimeofday (&s, 0);
      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 ();
    }

    //将perm[]中的随机数转变为0-11间的整数

    void init_hash()
    {
        int i, n, j;
        int p[12];
        getrnd();
        int a, d;
        printf("开始的perm[]: ");
        for (a = 0; a < 12; a++)     //  刚开始获得的在perm[]和xor[]存放的随机数
            printf("%d ", perm[a]);
        printf(" ");
        printf("开始的xor[] ");
        for (d = 0; d < 12; d++)
            printf("%d ", xor[d]);
        printf(" ");                      
        for (i = 0; i < 12; i++)
            p[i] = i;
        for (i = 0; i < 12; i++)     
        {
            n = perm[i] % (12 - i);
            perm[i] = p[n];       //每得到一个新的n值,p[n]赋值后,数组p[]中从新n的位置起,数组内容依次前移一个位置
            for (j = 0; j < 11 - n; j++)//相应的数组p[]中的值11加1
               p[n + j] = p[n + j + 1]; //这样做的目的是保证最后perm[]被重新赋值后,里面没有重复的数字                          
            int b, e;                         //都是随机的0-11之间.
            printf("************* ");// 这里源程序中是没有的,是我为了测试每次perm[]和p[]内容变化自己加的。
            printf("p[]: ");
            for (b = 0; b < 12; b++)
                printf("%d ", p[b]);
            printf(" ");
            printf("perm[] : ");
            for (e = 0; e < 12; e++)
            {
                printf("%d ", perm[e]);
            }
            printf(" ");
            printf("************* ");
        }
    }

    //网络流分类技术中一般会利用四元组或五元组进行分流
     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++)  //这里重点解释一下,perm[]中存放的是0-11的随机数,data[perm[]]当然也就是随机
          res = ((res << 8) + (data[perm[i]] ^ xor[i])) % 0xff100f; //它与xor[]异或(二进制异或相同为0,不同为1)
        return res;  //左移8位(值扩大2的8次方)最后取余(0xff100f是素数:16715791)
    }   

    int main()
    {
        int i;
        init_hash();
        printf("后来的perm[]: ");
        for (i = 0; i < 12; i++)
            printf("%d ", perm[i]);
        printf(" ");
        printf("xor[]: ");
        for (i = 0; i < 12; i++)
            printf("%d ", xor[i]);
        printf(" ");
        printf("%d ", mkhash(inet_addr("192.168.0.1"), 0, inet_addr("192.168.0.2"), 1));
        printf("%d ",mkhash(inet_addr("245.138.54.32"), 25,inet_addr("255.255.212.123"), 66));
        printf("%d ",mkhash(inet_addr("192.45.45.65"), 55, inet_addr("255.24.89.78"),55));
        return 0;
    }

    运行结果:

    结果显示不下了 后面的输出为:

    后来的perm[]:
    7 3 11 5 4 1 0 6 2 10 9 8
    xor[]:
    19 222 165 159 131 179 89 152 25 215 151 248
    16052679
    5113261
    7605888

  • 相关阅读:
    全栈工程师学习Linux技术的忠告
    实战CentOS系统部署Hadoop集群服务
    如何安装最新的 XFCE 桌面?
    scrapy爬虫框架(二)
    scrapy爬虫框架(一)
    数据结构与算法(二)
    IDEA 常用快捷键
    数据结构与算法(一)
    es6之模板字符串
    es6之箭头函数
  • 原文地址:https://www.cnblogs.com/soyo/p/5670111.html
Copyright © 2011-2022 走看看