/#include "iostream.h"
秀嶼ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
#include iostream
#include "string.h"
#include "fstream"
#define NULL 0
unsigned int key;
unsigned int key2;
int *p;
struct node //建節(jié)點
{
char name[8],address[20];
char num[11];
node * next;
};
typedef node* pnode;
typedef node* mingzi;
node **phone;
node **nam;
node *a;
using namespace std; //使用名稱空間
void hash(char num[11]) //哈希函數(shù)
{
int i = 3;
key=(int)num[2];
while(num[i]!=NULL)
{
key+=(int)num[i];
i++;
}
key=key%20;
}
void hash2(char name[8]) //哈希函數(shù)
{
int i = 1;
key2=(int)name[0];
while(name[i]!=NULL)
{
key2+=(int)name[i];
i++;
}
key2=key2%20;
}
node* input() //輸入節(jié)點
{
node *temp;
temp = new node;
temp-next=NULL;
cout"輸入姓名:"endl;
cintemp-name;
cout"輸入地址:"endl;
cintemp-address;
cout"輸入電話:"endl;
cintemp-num;
return temp;
}
int apend() //添加節(jié)點
{
node *newphone;
node *newname;
newphone=input();
newname=newphone;
newphone-next=NULL;
newname-next=NULL;
hash(newphone-num);
hash2(newname-name);
newphone-next = phone[key]-next;
phone[key]-next=newphone;
newname-next = nam[key2]-next;
nam[key2]-next=newname;
return 0;
}
void create() //新建節(jié)點
{
int i;
phone=new pnode[20];
for(i=0;i20;i++)
{
phone[i]=new node;
phone[i]-next=NULL;
}
}
void create2() //新建節(jié)點
{
int i;
nam=new mingzi[20];
for(i=0;i20;i++)
{
nam[i]=new node;
nam[i]-next=NULL;
}
}
void list() //顯示列表
{
int i;
node *p;
for(i=0;i20;i++)
{
p=phone[i]-next;
while(p)
{
coutp-name'_'p-address'_'p-numendl;
p=p-next;
}
}
}
void list2() //顯示列表
{
int i;
node *p;
for(i=0;i20;i++)
{
p=nam[i]-next;
while(p)
{
coutp-name'_'p-address'_'p-numendl;
p=p-next;
}
}
}
void find(char num[11]) //查找用戶信息
{
hash(num);
node *q=phone[key]-next;
while(q!= NULL)
{
if(strcmp(num,q-num)==0)
break;
q=q-next;
}
if(q)
coutq-name"_" q-address"_"q-numendl;
else cout"無此記錄"endl;
}
void find2(char name[8]) //查找用戶信息
{
hash2(name);
node *q=nam[key2]-next;
while(q!= NULL)
{
if(strcmp(name,q-name)==0)
break;
q=q-next;
}
if(q)
coutq-name"_" q-address"_"q-numendl;
else cout"無此記錄"endl;
}
void save() //保存用戶信息
{
int i;
node *p;
for(i=0;i20;i++)
{
p=phone[i]-next;
while(p)
{
fstream iiout("out.txt", ios::out);
iioutp-name"_"p-address"_"p-numendl;
p=p-next;
}
}
}
void menu() //菜單
{
cout"0.添加記錄"endl;
cout"3.查找記錄"endl;
cout"2.姓名散列"endl;
cout"4.號碼散列"endl;
cout"5.清空記錄"endl;
cout"6.保存記錄"endl;
cout"7.退出系統(tǒng)"endl;
}
int main()
{
char num[11];
char name[8];
create();
create2() ;
int sel;
while(1)
{
menu();
cinsel;
if(sel==3)
{ cout"9號碼查詢,8姓名查詢"endl;
int b;
cinb;
if(b==9)
{ cout"請輸入電話號碼:"endl;
cin num;
cout"輸出查找的信息:"endl;
find(num);
}
else
{ cout"請輸入姓名:"endl;
cin name;
cout"輸出查找的信息:"endl;
find2(name);}
}
if(sel==2)
{ cout"姓名散列結(jié)果:"endl;
list2();
}
if(sel==0)
{ cout"請輸入要添加的內(nèi)容:"endl;
apend();
}
if(sel==4)
{ cout"號碼散列結(jié)果:"endl;
list();
}
if(sel==5)
{ cout"列表已清空:"endl;
create();
create2();
}
if(sel==6)
{ cout"通信錄已保存:"endl;
save();
}
if(sel==7) return 0;
}
return 0;
}
應(yīng)該是這個意思:
第一次沖突就是散列的位置+1,這次發(fā)生沖突了就繼續(xù)第二次
第二次用的是平方取中,55^2= 3025,當(dāng)然第二次沖突的RH2就是02了,答案(2)
有現(xiàn)成的SHA1算法函數(shù)
復(fù)制過來。
然后打開文件, 讀數(shù)據(jù), 調(diào)用SHA1函數(shù)即可。
#include?stdio.h
#include?stdlib.h
#include?string.h
#include?assert.h
#include?errno.h
#undef?BIG_ENDIAN_HOST
typedef?unsigned?int?u32;
/****************
*?Rotate?a?32?bit?integer?by?n?bytes
*/
#if?defined(__GNUC__)??defined(__i386__)
static?inline?u32
rol(?u32?x,?int?n)
{
__asm__("roll?%%cl,%0"
:"=r"?(x)
:"0"?(x),"c"?(n));
return?x;
}
#else
#define?rol(x,n)?(?((x)??(n))?|?((x)??(32-(n)))?)
#endif
typedef?struct?{
u32??h0,h1,h2,h3,h4;
u32??nblocks;
unsigned?char?buf[64];
int??count;
}?SHA1_CONTEXT;
void
sha1_init(?SHA1_CONTEXT?*hd?)
{
hd-h0?=?0x67452301;
hd-h1?=?0xefcdab89;
hd-h2?=?0x98badcfe;
hd-h3?=?0x10325476;
hd-h4?=?0xc3d2e1f0;
hd-nblocks?=?0;
hd-count?=?0;
}
/****************
*?Transform?the?message?X?which?consists?of?16?32-bit-words
*/
static?void
transform(?SHA1_CONTEXT?*hd,?unsigned?char?*data?)
{
u32?a,b,c,d,e,tm;
u32?x[16];
/*?get?values?from?the?chaining?vars?*/
a?=?hd-h0;
b?=?hd-h1;
c?=?hd-h2;
d?=?hd-h3;
e?=?hd-h4;
#ifdef?BIG_ENDIAN_HOST
memcpy(?x,?data,?64?);
#else
{
int?i;
unsigned?char?*p2;
for(i=0,?p2=(unsigned?char*)x;?i??16;?i++,?p2?+=?4?)?
{
p2[3]?=?*data++;
p2[2]?=?*data++;
p2[1]?=?*data++;
p2[0]?=?*data++;
}
}
#endif
#define?K1??0x5A827999L
#define?K2??0x6ED9EBA1L
#define?K3??0x8F1BBCDCL
#define?K4??0xCA62C1D6L
#define?F1(x,y,z)???(?z?^?(?x??(?y?^?z?)?)?)
#define?F2(x,y,z)???(?x?^?y?^?z?)
#define?F3(x,y,z)???(?(?x??y?)?|?(?z??(?x?|?y?)?)?)
#define?F4(x,y,z)???(?x?^?y?^?z?)
#define?M(i)?(?tm?=???x[i0x0f]?^?x[(i-14)0x0f]?\
^?x[(i-8)0x0f]?^?x[(i-3)0x0f]?\
,?(x[i0x0f]?=?rol(tm,1))?)
#define?R(a,b,c,d,e,f,k,m)??do?{?e?+=?rol(?a,?5?)?????\
+?f(?b,?c,?d?)??\
+?k ??????\
+?m; ??????\
b?=?rol(?b,?30?);????\
}?while(0)
R(?a,?b,?c,?d,?e,?F1,?K1,?x[?0]?);
R(?e,?a,?b,?c,?d,?F1,?K1,?x[?1]?);
R(?d,?e,?a,?b,?c,?F1,?K1,?x[?2]?);
R(?c,?d,?e,?a,?b,?F1,?K1,?x[?3]?);
R(?b,?c,?d,?e,?a,?F1,?K1,?x[?4]?);
R(?a,?b,?c,?d,?e,?F1,?K1,?x[?5]?);
R(?e,?a,?b,?c,?d,?F1,?K1,?x[?6]?);
R(?d,?e,?a,?b,?c,?F1,?K1,?x[?7]?);
R(?c,?d,?e,?a,?b,?F1,?K1,?x[?8]?);
R(?b,?c,?d,?e,?a,?F1,?K1,?x[?9]?);
R(?a,?b,?c,?d,?e,?F1,?K1,?x[10]?);
R(?e,?a,?b,?c,?d,?F1,?K1,?x[11]?);
R(?d,?e,?a,?b,?c,?F1,?K1,?x[12]?);
R(?c,?d,?e,?a,?b,?F1,?K1,?x[13]?);
R(?b,?c,?d,?e,?a,?F1,?K1,?x[14]?);
R(?a,?b,?c,?d,?e,?F1,?K1,?x[15]?);
R(?e,?a,?b,?c,?d,?F1,?K1,?M(16)?);
R(?d,?e,?a,?b,?c,?F1,?K1,?M(17)?);
R(?c,?d,?e,?a,?b,?F1,?K1,?M(18)?);
R(?b,?c,?d,?e,?a,?F1,?K1,?M(19)?);
R(?a,?b,?c,?d,?e,?F2,?K2,?M(20)?);
R(?e,?a,?b,?c,?d,?F2,?K2,?M(21)?);
R(?d,?e,?a,?b,?c,?F2,?K2,?M(22)?);
R(?c,?d,?e,?a,?b,?F2,?K2,?M(23)?);
R(?b,?c,?d,?e,?a,?F2,?K2,?M(24)?);
R(?a,?b,?c,?d,?e,?F2,?K2,?M(25)?);
R(?e,?a,?b,?c,?d,?F2,?K2,?M(26)?);
R(?d,?e,?a,?b,?c,?F2,?K2,?M(27)?);
R(?c,?d,?e,?a,?b,?F2,?K2,?M(28)?);
R(?b,?c,?d,?e,?a,?F2,?K2,?M(29)?);
R(?a,?b,?c,?d,?e,?F2,?K2,?M(30)?);
R(?e,?a,?b,?c,?d,?F2,?K2,?M(31)?);
R(?d,?e,?a,?b,?c,?F2,?K2,?M(32)?);
R(?c,?d,?e,?a,?b,?F2,?K2,?M(33)?);
R(?b,?c,?d,?e,?a,?F2,?K2,?M(34)?);
R(?a,?b,?c,?d,?e,?F2,?K2,?M(35)?);
R(?e,?a,?b,?c,?d,?F2,?K2,?M(36)?);
R(?d,?e,?a,?b,?c,?F2,?K2,?M(37)?);
R(?c,?d,?e,?a,?b,?F2,?K2,?M(38)?);
R(?b,?c,?d,?e,?a,?F2,?K2,?M(39)?);
R(?a,?b,?c,?d,?e,?F3,?K3,?M(40)?);
R(?e,?a,?b,?c,?d,?F3,?K3,?M(41)?);
R(?d,?e,?a,?b,?c,?F3,?K3,?M(42)?);
R(?c,?d,?e,?a,?b,?F3,?K3,?M(43)?);
R(?b,?c,?d,?e,?a,?F3,?K3,?M(44)?);
R(?a,?b,?c,?d,?e,?F3,?K3,?M(45)?);
R(?e,?a,?b,?c,?d,?F3,?K3,?M(46)?);
R(?d,?e,?a,?b,?c,?F3,?K3,?M(47)?);
R(?c,?d,?e,?a,?b,?F3,?K3,?M(48)?);
R(?b,?c,?d,?e,?a,?F3,?K3,?M(49)?);
R(?a,?b,?c,?d,?e,?F3,?K3,?M(50)?);
R(?e,?a,?b,?c,?d,?F3,?K3,?M(51)?);
R(?d,?e,?a,?b,?c,?F3,?K3,?M(52)?);
R(?c,?d,?e,?a,?b,?F3,?K3,?M(53)?);
R(?b,?c,?d,?e,?a,?F3,?K3,?M(54)?);
R(?a,?b,?c,?d,?e,?F3,?K3,?M(55)?);
R(?e,?a,?b,?c,?d,?F3,?K3,?M(56)?);
R(?d,?e,?a,?b,?c,?F3,?K3,?M(57)?);
R(?c,?d,?e,?a,?b,?F3,?K3,?M(58)?);
R(?b,?c,?d,?e,?a,?F3,?K3,?M(59)?);
R(?a,?b,?c,?d,?e,?F4,?K4,?M(60)?);
R(?e,?a,?b,?c,?d,?F4,?K4,?M(61)?);
R(?d,?e,?a,?b,?c,?F4,?K4,?M(62)?);
R(?c,?d,?e,?a,?b,?F4,?K4,?M(63)?);
R(?b,?c,?d,?e,?a,?F4,?K4,?M(64)?);
R(?a,?b,?c,?d,?e,?F4,?K4,?M(65)?);
R(?e,?a,?b,?c,?d,?F4,?K4,?M(66)?);
R(?d,?e,?a,?b,?c,?F4,?K4,?M(67)?);
R(?c,?d,?e,?a,?b,?F4,?K4,?M(68)?);
R(?b,?c,?d,?e,?a,?F4,?K4,?M(69)?);
R(?a,?b,?c,?d,?e,?F4,?K4,?M(70)?);
R(?e,?a,?b,?c,?d,?F4,?K4,?M(71)?);
R(?d,?e,?a,?b,?c,?F4,?K4,?M(72)?);
R(?c,?d,?e,?a,?b,?F4,?K4,?M(73)?);
R(?b,?c,?d,?e,?a,?F4,?K4,?M(74)?);
R(?a,?b,?c,?d,?e,?F4,?K4,?M(75)?);
R(?e,?a,?b,?c,?d,?F4,?K4,?M(76)?);
R(?d,?e,?a,?b,?c,?F4,?K4,?M(77)?);
R(?c,?d,?e,?a,?b,?F4,?K4,?M(78)?);
R(?b,?c,?d,?e,?a,?F4,?K4,?M(79)?);
/*?Update?chaining?vars?*/
hd-h0?+=?a;
hd-h1?+=?b;
hd-h2?+=?c;
hd-h3?+=?d;
hd-h4?+=?e;
}
/*?Update?the?message?digest?with?the?contents
*?of?INBUF?with?length?INLEN.
*/
static?void
sha1_write(?SHA1_CONTEXT?*hd,?unsigned?char?*inbuf,?size_t?inlen)
{
if(?hd-count?==?64?)?{?/*?flush?the?buffer?*/
transform(?hd,?hd-buf?);
hd-count?=?0;
hd-nblocks++;
}
if(?!inbuf?)
return;
if(?hd-count?)?{
for(?;?inlen??hd-count??64;?inlen--?)
hd-buf[hd-count++]?=?*inbuf++;
sha1_write(?hd,?NULL,?0?);
if(?!inlen?)
return;
}
while(?inlen?=?64?)?{
transform(?hd,?inbuf?);
hd-count?=?0;
hd-nblocks++;
inlen?-=?64;
inbuf?+=?64;
}
for(?;?inlen??hd-count??64;?inlen--?)
hd-buf[hd-count++]?=?*inbuf++;
}
/*?The?routine?final?terminates?the?computation?and
*?returns?the?digest.
*?The?handle?is?prepared?for?a?new?cycle,?but?adding?bytes?to?the
*?handle?will?the?destroy?the?returned?buffer.
*?Returns:?20?bytes?representing?the?digest.
*/
static?void
sha1_final(SHA1_CONTEXT?*hd)
{
u32?t,?msb,?lsb;
unsigned?char?*p;
sha1_write(hd,?NULL,?0);?/*?flush?*/;
t?=?hd-nblocks;
/*?multiply?by?64?to?make?a?byte?count?*/
lsb?=?t??6;
msb?=?t??26;
/*?add?the?count?*/
t?=?lsb;
if(?(lsb?+=?hd-count)??t?)
msb++;
/*?multiply?by?8?to?make?a?bit?count?*/
t?=?lsb;
lsb?=?3;
msb?=?3;
msb?|=?t??29;
if(?hd-count??56?)?{?/*?enough?room?*/
hd-buf[hd-count++]?=?0x80;?/*?pad?*/
while(?hd-count??56?)
hd-buf[hd-count++]?=?0;??/*?pad?*/
}
else?{?/*?need?one?extra?block?*/
hd-buf[hd-count++]?=?0x80;?/*?pad?character?*/
while(?hd-count??64?)
hd-buf[hd-count++]?=?0;
sha1_write(hd,?NULL,?0);??/*?flush?*/;
memset(hd-buf,?0,?56?);?/*?fill?next?block?with?zeroes?*/
}
/*?append?the?64?bit?count?*/
hd-buf[56]?=?msb??24;
hd-buf[57]?=?msb??16;
hd-buf[58]?=?msb???8;
hd-buf[59]?=?msb ???;
hd-buf[60]?=?lsb??24;
hd-buf[61]?=?lsb??16;
hd-buf[62]?=?lsb???8;
hd-buf[63]?=?lsb ???;
transform(?hd,?hd-buf?);
p?=?hd-buf;
#ifdef?BIG_ENDIAN_HOST
#define?X(a)?do?{?*(u32*)p?=?hd-h##a?;?p?+=?4;?}?while(0)
#else?/*?little?endian?*/
#define?X(a)?do?{?*p++?=?hd-h##a??24;?*p++?=?hd-h##a??16; ?\
*p++?=?hd-h##a??8;?*p++?=?hd-h##a;?}?while(0)
#endif
X(0);
X(1);
X(2);
X(3);
X(4);
#undef?X
}