//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[]:\n");
    for (a = 0; a < 12; a++)     //  刚开始获得的在perm[]和xor[]存放的随机数
        printf("%d ", perm[a]);
    printf("\n");
    printf("开始的xor[]\n");
    for (d = 0; d < 12; d++)
        printf("%d ", xor[d]);
    printf("\n");                      
    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("*************\n");// 这里源程序中是没有的,是我为了测试每次perm[]和p[]内容变化自己加的。
        printf("p[]:\n");
        for (b = 0; b < 12; b++)
            printf("%d ", p[b]);
        printf("\n");
        printf("perm[] :\n");
        for (e = 0; e < 12; e++)
        {
            printf("%d ", perm[e]);
        }
        printf("\n");
        printf("*************\n");
    }
}

//网络流分类技术中一般会利用四元组或五元组进行分流
 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[]:\n");
    for (i = 0; i < 12; i++)
        printf("%d ", perm[i]);
    printf("\n");
    printf("xor[]:\n");
    for (i = 0; i < 12; i++)
        printf("%d ", xor[i]);
    printf("\n");
    printf("%d\n", mkhash(inet_addr("192.168.0.1"), 0, inet_addr("192.168.0.2"), 1));
    printf("%d\n",mkhash(inet_addr("245.138.54.32"), 25,inet_addr("255.255.212.123"), 66));
    printf("%d\n",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

libnids 中哈希表的建立的更多相关文章

  1. js中哈希表的几种用法总结

    本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...

  2. Java中哈希表(Hashtable)是如何实现的

    Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...

  3. C#中哈希表与List的比较

    简单概念 在c#中,List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构. 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有 ...

  4. [转]net中哈希表的使用 Hashtable

    本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...

  5. C++ STL中哈希表Map 与 hash_map 介绍

    0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...

  6. C#中哈希表(HashTable)的用法详解以及和Dictionary比较

    1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...

  7. MySQL中哈希表

    也称为散列表 由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.加入某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,...,m-1}的 ...

  8. 转 C#中哈希表(HashTable)的用法详解

    看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...

  9. C#中哈希表(HashTable)的用法详解

    描述: 哈希表存放 key.values ,key值可以用于快速调取用,values 对应object类型,也就是说所有类型. 实例: 1.HashTable存放学生的成绩 Hashtable ht1 ...

随机推荐

  1. python 类的装饰器

    我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能.同理,一切皆对象,我们也可以使用装饰器为类添加类属性.what? def deco(obj): obj.x = 1 obj.y ...

  2. Python之面向对象反射

    Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...

  3. [luoguP1896] [SCOI2005]互不侵犯King(状压DP)

    传送门 先预处理出来一行中放置国王的所有情况和每种情况所用的国王个数. f[i][j][k]表示前i行放j个国王且最后一行的状态为k的方案数 状压DP即可 #include <cstdio> ...

  4. stl lower_bound()返回值

    http://blog.csdn.net/niushuai666/article/details/6734403 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回 ...

  5. [K/3Cloud] 代码中设置某个字段必录

    Control ctl = this.GetControl(fieldKey); FieldEditor editCtl = ctl as FieldEditor; if (editCtl != nu ...

  6. js Date()日期函数浏览器兼容问题解决方法

    一般 直接new Date() 是不会出现兼容性问题的,而 new Date(datetimeformatstring) 常常会出现浏览器兼容性问题,为什么,datetimeformatstring中 ...

  7. UVa 12563_Jin Ge Jin Qu hao

    [题意]在KTV唱歌,假设每首歌最长180s,时间结束时如果还有歌正在唱,则将此歌唱完.为使唱歌时间最长,规定最后唱长达678s的<劲歌金曲>[介是个嘛?] 假设你正在唱KTV,在剩余的t ...

  8. 作为一名CEO

    你 不能怕得罪人 不能奢望完成工作的时候 有太多的愉悦感 你 必须要去做左右为难但左右亦可的 操蛋决策 你 得脸皮够厚 肚囊儿宽超 什么事情都能快速消化 哪怕 是 一坨屎 你 还得 决不放弃 永不言败 ...

  9. 什么是Wiki?

    Wiki一词来源于夏威夷语的“wee kee wee kee”, 发音wiki, 原本是“快点快点”的意思,被译为“维基”或“维客”.一种多人协作的写作工具.Wiki站点可以有多人(甚至任何访问者)维 ...

  10. 【CV论文阅读】+【搬运工】LocNet: Improving Localization Accuracy for Object Detection + A Theoretical analysis of feature pooling in Visual Recognition

    论文的关注点在于如何提高bounding box的定位,使用的是概率的预测形式,模型的基础是region proposal.论文提出一个locNet的深度网络,不在依赖于回归方程.论文中提到locne ...