它使用相同的键添加到hash_mapp字符串

时间:2012-01-08 14:11:48

标签: c++ stl hashmap

我认为在hash_table中我无法添加相同的值。我的意思是插入(key1,value1),然后再插入它。

但在我的情况下,它添加了相同的哈希值相同的字符串。 我试图保持BYTE *作为键,但它仍然添加相同的字符串。

我使用过HCRYPTHASH *,HCRYPTHASH但它仍然无法正常工作。 也许需要覆盖hash_map的方法(在C#中我遇到了麻烦,当Dictionary中的键是我自己的类时所以我只是重写了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;
    }

1 个答案:

答案 0 :(得分:3)

您的大多数代码似乎与您的观察完全无关:std::hash_map<BYTE*, std::string>(实际上不是标准C ++类,尽管使用std::有点误导; C ++ 2011中的散列映射称为std::unordered_map)使用BTYE*作为键。传入的两个指针明显不同。您似乎计算的哈希值将放入映射的,而不是其键。

虽然将指针用作键有时很有用,但通常需要使用值类型,例如std::vector<BYTE>,作为关键。