MatrixHash 实现和测试(二)

hash函数,实现从64bit生成32bit的hash,效率相对不错,但对时间没有进行测试,另外空间开销相对较大。

/*************************************************************************
> File Name: hash_table.cpp
> Author:wjy
> Mail: [email protected]
> Created Time: 二 7/ 8 09:54:52 2014
************************************************************************/

#include<iostream>
#include <time.h>
#include <string.h>
#include <ctime>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

unsigned long matrix[]={
694164548, 3789149486, 3807463199, 2684797435, 2359943013, 2231240996, 2135863124, 1211164704, 2302089482, 4105647604, 3076642034, 72161852, 59560020, 611878035, 2814490697, 3915797072, 1219075273, 3978906545, 193953705, 4132630722, 2627050652, 1989142569, 2745032496, 735086709, 3485798578, 1637027010, 2467907528, 3110718702, 1201254602, 3737777921, 796676896, 2349326933, 2449810837, 3910433321, 3550767862, 1644342526, 1438602584, 2179832898, 3868189175, 1814084994, 615833333, 2031832363, 3130167043, 4200349959, 1930419194, 3787258680, 3369981751, 3329843958, 3446569769, 3858118227, 163055231, 1009035244, 422846498, 1011763997, 533633029, 2557610330, 4221463260, 95017657, 88369066, 3227540105, 3815919250, 2234633741, 1819183943, 556442040
};
void changeToArray(unsigned long long input , int *array,int len) {
len = 64;
for(int i=0;i<len;i++) {
if(((input>>i)&0x1) == 1) {
array[i] = 1;
} else {
array[i] = 0;
}
}
}
int Matrix[32][64];
void changeToMatrix(){
for(int i=0;i<32;i++)
for(int j=0;j<64;j++) {
if(((matrix[i]>>j)&0x1)==1) {
Matrix[i][j] = 1;
} else {
Matrix[i][j] = 0;
}
}
}
unsigned int MatrixHash(unsigned long long input) {
int tmp[64];
changeToArray(input,tmp,64);
// for(int i=0;i<64;i++)
// cout<<tmp[i];
unsigned int res=0;
for(int i=0;i<64;i++) {
if(tmp[i]==1) {
res = res ^ matrix[i];
}
}
return res;
}

/* End Of AP Hash Function */
const int NUM = 1000003; //10000019
struct HashNode {
unsigned long long key;
unsigned int value;
HashNode *next;
bool flag;
HashNode(){
flag=false;
next = NULL;
key=0;
value = 0;
}
HashNode(unsigned long long key,int value):key(key),value(value){
next = NULL;
flag = false;
}
};
HashNode hnode[NUM];
/*unsigned int hashvalue(char *str) {
register unsigned int h;
register unsigned char *p;
for(h=0,p=(unsigned char *)str;*p;p++) {
h = (h<<5) - h + (*p); // h = 31 * h + *p;
}
return h;
}*/
bool isContainsKey(unsigned long long key) {
char tmp[65];
// itoa(key,tmp,10);
// sprintf(tmp,"%d",key);
// int len = strlen(tmp);
unsigned int hashcode = MatrixHash(key)%NUM;
if(hnode[hashcode].flag==false) {
return false;
} else {
HashNode *p = &hnode[hashcode];
while(p!=NULL) {
if(p->key==key) {
return true;
}
p = p -> next;
}
}
return false;
}
void put(unsigned long long key,int value) {
// char tmp[65];
// itoa(key,tmp,10);
// sprintf(tmp,"%d",key);
// int len=strlen(tmp);

unsigned int hashcode = MatrixHash(key)%NUM;
if(hnode[hashcode].flag==false) {
hnode[hashcode].flag = true;
hnode[hashcode].key = key;
hnode[hashcode].value = value;
} else if(!isContainsKey(key)){
HashNode *p = new HashNode(key,value);
p->flag = true;
p->next = hnode[hashcode].next;
hnode[hashcode].next = p;
} else {
HashNode *p = &hnode[hashcode];
while(p!=NULL) {
if(p->key==key) {
p->value = value;
break;
}
p = p -> next;
}
}
}
int get(unsigned long long key){
// char tmp[65];
// itoa(key,tmp,10);
// sprintf(tmp,"%llu",key);
// int len = strlen(tmp);
unsigned int hashcode = MatrixHash(key)%NUM;
if(isContainsKey(key)==false){
// alert("the key not exists");
return -1;
} else {
HashNode *p = &hnode[hashcode];
while(p!=NULL) {
if(p->key==key) {
return p->value;
}
p = p -> next;
}
}
return -1;
}
unsigned long long strToUll(char * key,int len) {
unsigned long long res = 0;
for(int i=len-1;i>=0;i--) {

res = res * 10 + (key[i]-‘0‘);
}
return res;
}
int main(){
FILE *fp = fopen("data.txt","r");
if(fp==NULL) {
cout<<"end"<<endl;
exit(-1);
}
char key[65];
while(!feof(fp)) {
fscanf(fp,"%s",key);
int len = strlen(key);
put(strToUll(key,len),1);
}
fclose(fp);
fp = fopen("matrixhash","w");
FILE* fp2 = fopen("count_matrixhash","w");
int sum = 0;
for(int i=0;i<NUM;i++) {
int count = 0;
HashNode *p = &hnode[i];
while(p!=NULL&&p->flag!=false) {
if(p->flag!=false) {
count++;
if(p->key!=0)
fprintf(fp,"%llu->%d\n",p->key,p->value);
}
p=p->next;
}
if(count>0) sum+=1;
if(count>=1) {
// fprintf(fp2,"%d th node has %d collision\n",i,count);
fprintf(fp2,"%d\n",count);
}
}
cout<<"matrixhash"<<"\t"<<count<<"\t"<<NUM<<endl;
fclose(fp2);
fclose(fp);
return 0;
}

MatrixHash 实现和测试(二),布布扣,bubuko.com

时间: 2024-10-07 05:25:22

MatrixHash 实现和测试(二)的相关文章

Android APP压力测试(二)之Monkey信息自动收集脚本

Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息,主要收集Monkey测试日志.手机日志.手机屏幕截图.测试手机信息,自动按次按时间点保存信息.只需轻轻一点,腾出手腾出脑想干吗干吗,执行结束应该有信息的都有收集,一定程序提升了效率,节约了时间.可以偷空看看美图.聊天扯淡...哦不,是学习提高审美观,沟通交流增进同事情感... 转载请注明出处:Find

ELK Stack最新版本测试二配置篇

阅读本文前请浏览 ELK Stack最新版本测试一安装篇 http://jerrymin.blog.51cto.com/3002256/1720109 详细配置如下: 一,客户端 1,nginx日志格式 log_format logstash_json '{ "@timestamp": "$time_iso8601", '                         '"host": "$server_addr", '  

SharePoint 2013 列表关于大数据的测试&lt;二&gt;

1.给测试列表添加查阅项字段,100个,代码如下: 2.插入测试数据的方法,注意查阅项字段的格式,代码如下: 3.插入10w条数据,时间花费如下(不建议List[LISTNAME].Items.Add,会比较慢): 4.查看列表设置,数据有10w条,阙值设置500w,如下图: 5.进入AllItems页面,发现查阅项字段数大于限制(8个),如下图: 6.修改查阅项限制数目(修改为500),如下图: 7.数据量10w,查阅项字段100个时的测试数据,如下表格: 表一:分页30,LookUp字段50

测试c语言函数调用性能因素之测试二

函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作. 操作: 1,               调用函数帧指针(函数参数,局部变量,栈帧状态值,函数返回地址)入栈,栈指针自减 2,               保存调用函数的状态数据入寄存器 3,               被调用函数帧指针入栈,执行当前的被调用函数 4,               被调用函数执行结束,退栈,返回到调用函数的帧指针,从寄存

大数据项目测试&lt;二&gt;项目的测试工作

大数据的测试工作: 1.模块的单独测试 2.模块间的联调测试 3.系统的性能测试:内存泄露.磁盘占用.计算效率 4.数据验证(核心) 下面对各个模块的测试工作进行单独讲解. 0. 功能测试 1. 性能测试 2. 自动化测试 3. 文档评审 4. 脚本开发 一.后台数据处理端 后端的测试重点,主要集中在数据的采集处理.标签计算效率.异常数据排查(功能),测试脚本编写(HiveQL).自动化脚本编写(造数据.数据字段检查等) 1.数据的采集处理(Extract-Transform-Load) ETL

AngularJS测试二 jasmine测试路由 控制器 过滤器 事件 服务

测试应用 1.测试路由 我们需要检测路由是否在运作,是否找到了,或者是404了.我们要确认路由事件触发了,预期的模板是否真的加载了.既然路由会改变页面的地址(URL)和页面内容,我们需要检测路由是否被加载了,页面是否找到了,在这中间发生了什么. 一段简单的路由代码: angular.module('myApp', ['ngRoute']) .config(function($routeProvider) { $routeProvider .when('/', { templateUrl: 'vi

Android APP压力测试(二)之Monkey信息自动收集脚本【转】

前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息,主要收集Monkey测试日志.手机日志.手机屏幕截图.测试手机信息,自动按次按时间点保存信息.只需轻轻一点,腾出手腾出脑想干吗干吗,执行结束应该有信息的都有收集,一定程序提升了效率,节约了时间.可以偷空看看美图.聊天扯淡...哦不,是学习提高审美观,沟通交流增进同事情感... 转载请注明出处:Findyou   http://www.cnblogs.com/findyo

Web安全测试二步走

Web安全测试也应该遵循尽早测试的原则,在进行功能测试的时候(就应该执行下面的测试Checklist安全测试场景),然后在功能测试完成之后.性能测试之前进行扫描测试,可以用工具AppScan,Hp Webinspect,AWS等漏洞扫描工具进行扫描. 第一步:比较常用的安全测试Checklist如下: 1:不登录系统,直接输入登录后的页面URL是否可以访问. 2:不登录系统,直接输入下载文件的URL是否可以下载文件. 3:退出登录后,点击浏览器的的后退按钮能否访问之前的页面. 4:手动更改URL

HBase的java客户端测试(二)---DML操作

测试准备 [首先同步时间:] for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node "date -s '2017-12-30 21:32:30'";done [slave各节点启动zookeeper集群:] cd /software/zookeeper-3.4.10/bin/ && ./zkServer.sh start && cd - &&