當前位置:成語大全網 - 新華字典 - C語言中的hash函數

C語言中的hash函數

Hash,壹般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是壹種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯壹的確定輸入值。簡單的說就是壹種將任意長度的消息壓縮到某壹固定長度的消息摘要的函數。

HASH主要用於信息安全領域中加密算法,它把壹些不同長度的信息轉化成雜亂的128位的編碼裏,叫做HASH值. 也可以說,hash就是找到壹種數據內容和數據存放地址之間的映射關系。Hash算法在信息安全方面的應用主要體現在以下的3個方面:文件校驗、數字簽名、鑒權協議

程程序實現

// 說明:Hash函數(即散列函數)在程序設計中的應用目標 ------ 把壹個對象通過某種轉換機制對應到壹個

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

// 而應用Hash函數的領域主要是 hash表(應用非常廣)、密碼等領域。

// 實現說明:

// ⑴、這裏使用了函數對象以及泛型技術,使得對所有類型的對象(關鍵字)都適用。

// ⑵、常用類型有對應的偏特化,比如string、char*、各種整形等。

// ⑶、版本可擴展,如果妳對某種類型有特殊的需要,可以在後面實現專門化。

// ⑷、以下實現壹般放在頭文件中,任何包含它的都可使用hash函數對象。

//------------------------------------實現------------------------------------------------

#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;

};

// 壹般的對象,比如:vector< queue<string> >;的對象,需要強制轉化

template < class Key >

size_thash<Key>::operator () (const Key& k) const

{

size_tres = 0;

size_tlen = sizeof(Key);

const char* p = reinterpret_cast<const char*>(&k);

while (len--)

{

res = (res<<1)^*p++;

}

return res;

}

// 偏特化

template<>

size_thash< string >::operator () (const string& str) const

{

return hash_str(str.c_str());

}

typedef char* PChar;

template<>

size_thash<PChar>::operator () (const PChar& s) const

{

return hash_str(s);

}

typedef const char* PCChar;

template<>

size_thash<PCChar>::operator () (const PCChar& s) const

{

return hash_str(s);

}

template<> size_t hash<char>::operator () (const char& x) const { return x; }

template<> size_t hash<unsigned char>::operator () (const unsigned char& x) const { return x; }

template<> size_t hash<signed char>::operator () (const signed char& x) const { return x; }

template<> size_t hash<short>::operator () (const short& x) const { return x; }

template<> size_t hash<unsigned short>::operator () (const unsigned short& x) const { return x; }

template<> size_t hash<int>::operator () (const int& x) const { return x; }

template<> size_t hash<unsigned int>::operator () (const unsigned int& x) const { return x; }

template<> size_t hash<long>::operator () (const long& x) const { return x; }

template<> size_t hash<unsigned long>::operator () (const unsigned long& x) const { return x; }

// 使用說明:

//

// ⑴、使用時首先由於是泛型,所以要加上關鍵字類型。

//

// ⑵、其次要有壹個函數對象,可以臨時、局部、全局的,只要在作用域就可以。

//

// ⑶、應用函數對象作用於對應類型的對象。

//----------------------- hash函數使用舉例 -------------------------

#include <iostream>

#include <vector>

#include <string>

using namespace std;

int main()

{

vector<string> vstr⑵;

vstr[0] = "sjw";

vstr[1] = "suninf";

hash<string> strhash; // 局部函數對象

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

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

cout << " Hash value: " << hash< vector<string> >() (vstr) << endl;

cout << " Hash value: " << hash<int>() (100) << endl; // hash<int>() 臨時函數對象

return 0;

}