2012-01-08 8 views
0

hash_tableに同じ値を追加することはできません。私は挿入(キー1、値1)を意味し、それを再度挿入します。同じキーでhash_mapp文字列に追加する

私の場合、同じ文字列を同じハッシュで追加します。 私はキーとしてBYTE *を維持しようとしていましたが、それでも同じ文字列が追加されています。

私はHCRYPTHASH *、HCRYPTHASHを使用しましたが、それでも正しく動作しません。 多分それは

#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

「挿入」の**戻り値**を確認してください。 –

+0

両方の場合に1を返します –

答えて

3

(C#では、私は辞書で、キーは自分のクラスので、私はちょうど上書きしたいGetHashCodeメソッドだったときのトラブルを持って、再定義したメソッドに等しい)hash_mapのメソッドをオーバーライドするために必要とされることは、ほとんどのようですコードはstd::hash_map<BYTE*, std::string>(実際にではなく、std::のやや誤った使用にもかかわらず、標準C++クラスではなく、std::unordered_mapと呼ばれるハッシュマップはBTYE*をキーとして使用します)。 2つのポインタが渡されることは明らかに異なります。あなたが計算しているように見えるハッシュ値は、そのキーではなく、値にマッピングされます。

ポインタをキーとして使用すると便利なことがありますが、通常は値の型を使用します。 std::vector<BYTE>をキーとします。

+0

\t std :: hash_map 、std :: string> table1; \t std :: pair 、std :: string> pair1; \t std :: vector * a =新しい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 –

+0

に変換できないという単純なコードでは、これは' std :: vector 'のデフォルトのハッシュ関数がないことを意味します。 –

関連する問題