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[]:\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 中哈希表的建立的更多相关文章
- js中哈希表的几种用法总结
本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- C#中哈希表与List的比较
简单概念 在c#中,List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构. 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有 ...
- [转]net中哈希表的使用 Hashtable
本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...
- C++ STL中哈希表Map 与 hash_map 介绍
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...
- C#中哈希表(HashTable)的用法详解以及和Dictionary比较
1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...
- MySQL中哈希表
也称为散列表 由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.加入某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,...,m-1}的 ...
- 转 C#中哈希表(HashTable)的用法详解
看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...
- C#中哈希表(HashTable)的用法详解
描述: 哈希表存放 key.values ,key值可以用于快速调取用,values 对应object类型,也就是说所有类型. 实例: 1.HashTable存放学生的成绩 Hashtable ht1 ...
随机推荐
- codeforce 810B Summer sell-off (贪心 排序)
题意: 商店准备用n天售货(每天的货物都是一样的),第i天会卖ki件货物,并且会有li个顾客来买. 如果货物没卖完, 那么每个顾客一定会买一件. 如果货物有剩, 不会保存到第二天. 现在给定一个f, ...
- 九度oj 题目1061:成绩排序
题目1061:成绩排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:24473 解决:6960 题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排 ...
- DD & E-app
DD & E-app 企业内部开发的E应用 前端 demo https://github.com/open-dingtalk docs https://open-doc.dingtalk.co ...
- 安装eclipse插件,很慢终于找到了解决的方法
1 .除非你需要,否则不要选择"联接到所有更新站点" 在安装对话框里有一个小复选框,其标示为"在安装过程中联接到所有更新站点从而找到所需的软件."从表面上看,这 ...
- 破损的键盘(codevs 4650)
题目描述 Description 有一天,你需要打一份文件,但是你的键盘坏了,上面的"home"键和"end"键会时不时地按下,而你却毫不知情,甚至你都懒得打开 ...
- Caocao's Bridges-HDU4738(Tarjin+求桥)
http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意: 给定n个点和m条边 和每条边的价值,求桥的最小价值(最小桥) 看着挺简单的但是有好多细节: ...
- 06-js的逻辑结构
<html> <head> <title>js的逻辑结构和循环结构学习</title> <meta charset="UTF-8&quo ...
- JSP的文件上传
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/file-uploading.html: 一个JSP可以用一个HTML表单标签,它允许用户上传文件到服务器 ...
- How to remote debug neutron
First of all, I will assume that you know how to use pydevd to remote debug normal python program. I ...
- 数据库可视化操纵软件有navicat和sqlyog
数据库可视化操纵软件有navicat和sqlyog 数据库可视化操纵软件有navicat和sqlyog