Это добавить в строки hash_mapp с теми же ключами - PullRequest
0 голосов
/ 08 января 2012

Я думал, что в 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 Ответ

3 голосов
/ 08 января 2012

Кажется, что большая часть вашего кода совершенно не имеет отношения к вашему наблюдению: std::hash_map<BYTE*, std::string> (который на самом деле не стандартный класс C ++, несмотря на несколько вводящее в заблуждение использование std::; хешированная карта в C ++ 2011 называется std::unordered_map) использует ключ BTYE*. Два указателя , которые передаются, явно различаются. Хеш-значения, которые вы, похоже, вычисляете, помещаются в значение отображения, а не в его ключ.

Хотя иногда полезно использовать указатель в качестве ключа, обычно вы хотите использовать тип значений, например, std::vector<BYTE>, как ключ.

...