真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

哈希函數(shù)是c語(yǔ)言的嗎,哈希函數(shù)是c語(yǔ)言的嗎為什么

C語(yǔ)言版數(shù)據(jù)結(jié)構(gòu)哈希算法題:設(shè)m=16,HASH函數(shù)為H(key)=key mod 13,現(xiàn)采用再哈希法Hi=RHi(key)處理沖突

應(yīng)該是這個(gè)意思:

成都創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的廈門(mén)網(wǎng)站建設(shè)公司,廈門(mén)接單;提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行廈門(mén)網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

第一次沖突就是散列的位置+1,這次發(fā)生沖突了就繼續(xù)第二次

第二次用的是平方取中,55^2= 3025,當(dāng)然第二次沖突的RH2就是02了,答案(2)

C語(yǔ)言中的hash函數(shù)

Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長(zhǎng)度的輸入(又叫做預(yù)映射, pre-image),通過(guò)散列算法,變換成固定長(zhǎng)度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,而不可能從散列值來(lái)唯一的確定輸入值。簡(jiǎn)單的說(shuō)就是一種將任意長(zhǎng)度的消息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù)。

HASH主要用于信息安全領(lǐng)域中加密算法,它把一些不同長(zhǎng)度的信息轉(zhuǎn)化成雜亂的128位的編碼里,叫做HASH值. 也可以說(shuō),hash就是找到一種數(shù)據(jù)內(nèi)容和數(shù)據(jù)存放地址之間的映射關(guān)系。Hash算法在信息安全方面的應(yīng)用主要體現(xiàn)在以下的3個(gè)方面:文件校驗(yàn)、數(shù)字簽名、鑒權(quán)協(xié)議

程程序?qū)崿F(xiàn)

// 說(shuō)明:Hash函數(shù)(即散列函數(shù))在程序設(shè)計(jì)中的應(yīng)用目標(biāo) ------ 把一個(gè)對(duì)象通過(guò)某種轉(zhuǎn)換機(jī)制對(duì)應(yīng)到一個(gè)

//size_t類(lèi)型(即unsigned long)的整型值。

// 而應(yīng)用Hash函數(shù)的領(lǐng)域主要是 hash表(應(yīng)用非常廣)、密碼等領(lǐng)域。

// 實(shí)現(xiàn)說(shuō)明:

// ⑴、這里使用了函數(shù)對(duì)象以及泛型技術(shù),使得對(duì)所有類(lèi)型的對(duì)象(關(guān)鍵字)都適用。

// ⑵、常用類(lèi)型有對(duì)應(yīng)的偏特化,比如string、char*、各種整形等。

// ⑶、版本可擴(kuò)展,如果你對(duì)某種類(lèi)型有特殊的需要,可以在后面實(shí)現(xiàn)專(zhuān)門(mén)化。

// ⑷、以下實(shí)現(xiàn)一般放在頭文件中,任何包含它的都可使用hash函數(shù)對(duì)象。

//------------------------------------實(shí)現(xiàn)------------------------------------------------

#include string

using std::string;

inlinesize_thash_str(const char* s)

{

unsigned long res = 0;

for (; *s; ++s)

res = 5 * res + *s;

returnsize_t(res);

}

template class Key

struct hash

{

size_toperator () (const Key k) const;

};

// 一般的對(duì)象,比如:vector queuestring ;的對(duì)象,需要強(qiáng)制轉(zhuǎn)化

template class Key

size_thashKey::operator () (const Key k) const

{

size_tres = 0;

size_tlen = sizeof(Key);

const char* p = reinterpret_castconst char*(k);

while (len--)

{

res = (res1)^*p++;

}

return res;

}

// 偏特化

template

size_thash string ::operator () (const string str) const

{

return hash_str(str.c_str());

}

typedef char* PChar;

template

size_thashPChar::operator () (const PChar s) const

{

return hash_str(s);

}

typedef const char* PCChar;

template

size_thashPCChar::operator () (const PCChar s) const

{

return hash_str(s);

}

template size_t hashchar::operator () (const char x) const { return x; }

template size_t hashunsigned char::operator () (const unsigned char x) const { return x; }

template size_t hashsigned char::operator () (const signed char x) const { return x; }

template size_t hashshort::operator () (const short x) const { return x; }

template size_t hashunsigned short::operator () (const unsigned short x) const { return x; }

template size_t hashint::operator () (const int x) const { return x; }

template size_t hashunsigned int::operator () (const unsigned int x) const { return x; }

template size_t hashlong::operator () (const long x) const { return x; }

template size_t hashunsigned long::operator () (const unsigned long x) const { return x; }

// 使用說(shuō)明:

//

// ⑴、使用時(shí)首先由于是泛型,所以要加上關(guān)鍵字類(lèi)型。

//

// ⑵、其次要有一個(gè)函數(shù)對(duì)象,可以臨時(shí)、局部、全局的,只要在作用域就可以。

//

// ⑶、應(yīng)用函數(shù)對(duì)象作用于對(duì)應(yīng)類(lèi)型的對(duì)象。

//----------------------- hash函數(shù)使用舉例 -------------------------

#include iostream

#include vector

#include string

using namespace std;

int main()

{

vectorstring vstr⑵;

vstr[0] = "sjw";

vstr[1] = "suninf";

hashstring strhash; // 局部函數(shù)對(duì)象

cout " Hash value: " strhash(vstr[0]) endl;

cout " Hash value: " strhash(vstr[1]) endl;

cout " Hash value: " hash vectorstring () (vstr) endl;

cout " Hash value: " hashint() (100) endl; // hashint() 臨時(shí)函數(shù)對(duì)象

return 0;

}

c語(yǔ)言hash函數(shù)有幾種

#include?stdio.h#include?stdlib.h//這里我自己設(shè)計(jì)一個(gè)hash算法來(lái)快速查找一堆數(shù)字中相等的數(shù)字,這也許是最接近原理的算法了//一個(gè)整數(shù)整除27后的來(lái)作為hash函數(shù)//定義一個(gè)保存實(shí)際數(shù)據(jù)的結(jié)構(gòu)體節(jié)點(diǎn)struct?data_node{????int?num;????int?count;????struct?data_node?*next;};//定義一個(gè)結(jié)構(gòu)體時(shí)hash表的一部分typedef?struct{????int?key;?//余數(shù)????struct?data_node?*p;?//鏈表的頭指針}?hash_node;#define?HASH_SIZE?27int?do_hash(int?num)?//hash表來(lái)求余數(shù),這樣就可以了{(lán)????return?num%HASH_SIZE;}//初始化//添加數(shù)字//更新數(shù)字//刪除數(shù)字//查找數(shù)字hash_node?HashTable[HASH_SIZE];?//這里申明一個(gè)hashtable的數(shù)組//初始化函數(shù),需要做的事將key復(fù)制為null,將p指針指向null,返回一個(gè)頭指針來(lái)指向這個(gè)hashtablevoid?InitHashTable(hash_node?*HashTable)

{????//進(jìn)行參數(shù)的校驗(yàn)????for(int?i=0;iHASH_SIZE;i++)

{

HashTable[i].key?=?0;????????HashTable[i].p?=NULL;????}

}//保存到這個(gè)鏈表中//如果這個(gè)鏈表是空的話(huà),就作為頭指針,如果這個(gè)鏈表不為空,則添加到吧數(shù)字添加到末尾int?savedata(struct?data_node?**head,int?num)

{????struct?data_node?*tmp_p?=?*head;????struct?data_node?*p?=?(struct?data_node?*)malloc(sizeof(struct?data_node));????if(p?==?NULL)????????return?0;????if(*head?==?NULL)

{

*head?=?p;????????p-count?=?1;????????p-num?=?num;????????p-next?=?NULL;????}????else?//如果不為空,則這個(gè)時(shí)候應(yīng)該添加到鏈表末尾????{????????while(tmp_p?!=?NULL)//如果存在,則將這個(gè)節(jié)點(diǎn)的count加1就可以了????????{????????????if(tmp_p-num?==?num)

{

free(p);????????????????++tmp_p-count?;????????????????return?0;????????????}????????????if(tmp_p-next?==?NULL)????????????????break;????????????tmp_p?=?tmp_p-next;????????}

tmp_p-next?=?p;????????p-count?=1;????????p-num?=?num;????????p-next?=?NULL;????}????return?0;}//添加數(shù)字//將這個(gè)數(shù)字經(jīng)過(guò)hash求出結(jié)果,然后再保存到相應(yīng)的鏈表中//返回真或者假就可以了int?add_hash(hash_node?*HashTable,int?num)

{????int?mod?=?do_hash(num);????return?savedata(HashTable[mod].p,num);}int?main()

{????int?num?=?100;????hash_node?*H?=?HashTable;????InitHashTable(H);????add_hash(H,num);????add_hash(H,num);????add_hash(H,3);????add_hash(H,1);????add_hash(H,4);????//在這里我們可以發(fā)現(xiàn)一個(gè)好的hash函數(shù)是多么的重要,如果hash函數(shù)不好造成很多沖突的話(huà),效率并不會(huì)提高很多的,理想的情況是沖突幾乎沒(méi)有????//這也就是設(shè)計(jì)hash函數(shù)的精髓所在????return?0;}

數(shù)據(jù)結(jié)構(gòu) 哈希表,C語(yǔ)言解答

#include stdio.h

#includemalloc.h

#includestring.h

//#include

#define HASH_LEN 50 //哈希表的長(zhǎng)度

#define M 47

#define NAME_NO 30 //人名的個(gè)數(shù)

typedef struct NAME

{

char *py; //名字的拼音

int k; //拼音所對(duì)應(yīng)的整數(shù)

}NAME;

NAME NameList[HASH_LEN];

typedef struct hterm //哈希表

{

char *py; //名字的拼音

int k; //拼音所對(duì)應(yīng)的整數(shù)

int si; //查找長(zhǎng)度

}HASH;

HASH HashList[HASH_LEN];

/*-----------------------姓名(結(jié)構(gòu)體數(shù)組)初始化---------------------------------*/

void InitNameList()

{ int i;

char *f;

int r,s0;

NameList[0].py="chenghongxiu";

NameList[1].py="yuanhao";

NameList[2].py="yangyang";

NameList[3].py="zhanghen";

NameList[4].py="chenghongxiu";

NameList[5].py="xiaokai";

NameList[6].py="liupeng";

NameList[7].py="shenyonghai";

NameList[8].py="chengdaoquan";

NameList[9].py="ludaoqing";

NameList[10].py="gongyunxiang";

NameList[11].py="sunzhenxing";

NameList[12].py="sunrongfei";

NameList[13].py="sunminglong";

NameList[14].py="zhanghao";

NameList[15].py="tianmiao";

NameList[16].py="yaojianzhong";

NameList[17].py="yaojianqing";

NameList[18].py="yaojianhua";

NameList[19].py="yaohaifeng";

NameList[20].py="chengyanhao";

NameList[21].py="yaoqiufeng";

NameList[22].py="qianpengcheng";

NameList[23].py="yaohaifeng";

NameList[24].py="bianyan";

NameList[25].py="linglei";

NameList[26].py="fuzhonghui";

NameList[27].py="huanhaiyan";

NameList[28].py="liudianqin";

NameList[29].py="wangbinnian";

for (i=0;iNAME_NO;i++)// *求出各個(gè)姓名的拼音所對(duì)應(yīng)的整數(shù)

{

s0=0;

f=NameList[i].py;

for (r=0;*(f+r) != '\0';r++) //方法:將字符串的各個(gè)字符所對(duì)應(yīng)的ASCII碼相加,所得的整數(shù)做為哈希表的關(guān)鍵字

s0=*(f+r)+s0;

NameList[i].k=s0;

}

}

/*-----------------------建立哈希表---------------------------------*/

void CreateHashList()

{int i;

for ( i=0; iHASH_LEN;i++)//哈希表的初始化

{

HashList[i].py="";

HashList[i].k=0;

HashList[i].si=0;

}

for (i=0; iNAME_NO;)

{

int sum=0;

int adr=(NameList[i].k) % M; //哈希函數(shù)

int d=adr;

if(HashList[adr].si==0) //如果不沖突

{

HashList[adr].k=NameList[i].k;

HashList[adr].py=NameList[i].py;

HashList[adr].si=1;

}

else //沖突

{

do

{

d=(d+((NameList[i].k))%10+1)%M; //偽散列

sum=sum+1; //查找次數(shù)加1

}while (HashList[d].k!=0);

HashList[d].k=NameList[i].k;

HashList[d].py=NameList[i].py;

HashList[d].si=sum+1;

}i++;

}

}

/*-------------------------------------查找------------------------------------*/

void FindList()

{ int r;

char name[20]={0};

int s0=0;

int sum=1;

int adr;

int d;

printf("\n\n請(qǐng)輸入姓名的拼音: "); //輸入姓名

scanf("%s",name);

for ( r=0;r20;r++) //求出姓名的拼音所對(duì)應(yīng)的整數(shù)(關(guān)鍵字)

s0+=name[r];

adr=s0 % M; //使用哈希函數(shù)

d=adr;

if(HashList[adr].k==s0) //分3種情況進(jìn)行判斷

printf("\n姓名:%s 關(guān)鍵字:%d 查找長(zhǎng)度為: 1",HashList[d].py,s0);

else if (HashList[adr].k==0)

printf("無(wú)該記錄!");

else

{

int g=0;

do

{

d=(d+s0%10+1)%M; //偽散列

sum=sum+1;

if (HashList[d].k==0)

{

printf("無(wú)記錄! ");

g=1;

}

if (HashList[d].k==s0)

{

printf("\n姓名:%s 關(guān)鍵字:%d 查找長(zhǎng)度為:%d",HashList[d].py,s0,sum);

g=1;

}

}while(g==0);

}

}

/*--------------------------------顯示哈希表----------------------------*/

void Display()

{int i;

float average=0;

printf("\n\n地址\t關(guān)鍵字\t\t搜索長(zhǎng)度\tH(key)\t\t拼音 \n"); //顯示的格式

for( i=0; i15; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

// printf("按任意鍵繼續(xù)顯示...\n"); //由于數(shù)據(jù)比較多,所以分屏顯示(以便在Win9x/DOS下能看到所有的數(shù)據(jù))

// getch();

for( i=15; i30; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

// printf("按任意鍵繼續(xù)顯示...\n");

// getch();

for( i=30; i40; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

//printf("按任意鍵繼續(xù)顯示...\n");

//getch();

for( i=40; i50; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

for (i=0;iHASH_LEN;i++)

{average+=HashList[i].si;

average/=NAME_NO;

printf("\n\n平均查找長(zhǎng)度:ASL(%d)=%f \n\n",NAME_NO,average);

}

}

/*--------------------------------主函數(shù)----------------------------*/

void main()

{

/* ::SetConsoleTitle("哈希表操作"); //Windows API函數(shù),設(shè)置控制臺(tái)窗口的標(biāo)題

HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //獲得標(biāo)準(zhǔn)輸出設(shè)備的句柄

::SetConsoleTextAttribute(hCon, 10|0); //設(shè)置文本顏色

*/

printf("\n------------------------哈希表的建立和查找----------------------");

InitNameList();

CreateHashList ();

while(1)

{ char ch1;

printf("\n\n");

printf(" 1. 顯示哈希表\n");

printf(" 2. 查找\n");

printf(" 3. 退出\n");

err:

scanf("%c",ch1);

if (ch1=='1')

Display();

else if (ch1=='2')

FindList();

else if (ch1=='3')

return;

else

{

printf("\n請(qǐng)輸入正確的選擇!");

goto err;

}

}

}

C語(yǔ)言編程,求字符串的hash值(散列值)

#includestdio.h

int?main(){

char?s[256];

char?*p;

unsigned?long?long?int?h?=?0;

scanf("%s",?s);

for(p=s;?*p;?p++){

h?=?h*31?+?*p;

}

printf("%llu",?h);

}


當(dāng)前文章:哈希函數(shù)是c語(yǔ)言的嗎,哈希函數(shù)是c語(yǔ)言的嗎為什么
鏈接地址:http://weahome.cn/article/hdcpph.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部