2012-01-08 57 views
0

我認爲,到hash_table我不能添加相同的值。我的意思是插入(key1,value1),然後再插入它。這是添加到相同的密鑰hash_mapp字符串

但在我的情況下,它添加了相同的哈希相同的字符串。 我試圖保持BYTE *作爲一個鍵,但它仍然添加相同的字符串。

我已經使用HCRYPTHASH *,HCRYPTHASH,它仍然不正確。 也許它需要重寫的hash_map的方法(在C#中我取得了麻煩時,在字典關鍵是我自己的類,所以我只希望重寫的GetHashCode方法,並重新定義equals方法)

#include <hash_map> 
#include <string> 
#include <iostream> 
#include <Windows.h> 
#include <WinCrypt.h> 
#pragma comment(lib,"crypt32.lib") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::hash_map<BYTE*,std::string> table1; 
    HCRYPTHASH hash1; 
    HCRYPTPROV prov1; 
    std::string a1="noname"; 
    std::pair<BYTE*,std::string> pair1; 
    //insert first hash 
    ::CryptAcquireContext(&prov1,NULL,NULL,PROV_RSA_AES,0); 
    ::CryptCreateHash(prov1,CALG_MD4,0,0,&hash1); 
    BYTE* arr=(BYTE*)a1.c_str(); 
    DWORD len0=strlen((char*)arr)+1; 
    ::CryptHashData(hash1,arr,len0,0); 
    BYTE get[16]; 
    DWORD len=16; 
    ::CryptGetHashParam(hash1,HP_HASHVAL,get,&len,0); 
    pair1.first=get; 
    pair1.second=a1; 
    table1.insert(pair1); 
    /*----------------*/ 
    HCRYPTHASH hash2; 
    HCRYPTPROV prov2; 
    std::string a2="noname"; 
    std::pair<BYTE*,std::string> pair2; 
    //insert second hash 
    ::CryptAcquireContext(&prov2,NULL,NULL,PROV_RSA_AES,0); 
    ::CryptCreateHash(prov2,CALG_MD4,0,0,&hash2); 
    BYTE* arr1=(BYTE*)a2.c_str(); 
    DWORD len1=strlen((char*)arr1)+1; 
    ::CryptHashData(hash2,arr1,len1,0); 
    BYTE get1[16]; 
    DWORD len11=16; 
    ::CryptGetHashParam(hash2,HP_HASHVAL,get1,&len11,0); 
    pair2.first=get1; 
    pair2.second=a2; 
    table1.insert(pair2); 
    for each(std::pair<BYTE*,std::string> x in table1) 
    { 
     std::cout<<x.first<<" - - "<<x.second<<"\n"; 
    } 
    ::system("pause"); 
    return 0; 
    } 
+0

檢查'insert'的**返回值**。 – 2012-01-08 14:13:00

+0

它在兩種情況下返回1 – 2012-01-08 14:25:10

回答

3

似乎大多數的您的代碼與您的觀察完全無關:std::hash_map<BYTE*, std::string>(實際上不是是標準C++類,儘管有點誤導性使用std::; C++ 2011中的散列圖被稱爲std::unordered_map)使用BTYE*作爲關鍵。被傳入的兩個指針明顯不同。您似乎計算的散列值將放入映射的中,而不是它的關鍵字。

儘管使用指針作爲鍵有時很有用,但您通常希望使用值類型,例如, std::vector<BYTE>,作爲一個關鍵。

+0

'\t std :: hash_map ,std :: string> table1; \t std :: pair ,std :: string> pair1; \t std :: vector * a = new std :: vector (); \t std :: vector :: iterator iter; \t a-> insert(a-> begin(),5); \t pair1.first = * a; \t pair1.second =「noname」; \t table1.insert(pair1);' 在這樣簡單的代碼中,它表示不能將矢量<_Ty>轉換爲size_t – 2012-01-08 14:58:01

+0

這只是意味着沒有默認的「std :: vector '哈希函數'。 – 2012-01-08 15:31:45

相關問題