Почему std :: Hash имеет равный результат для разных строк? Я использовал msvc2010sp1, и я был удивлен, увидев этот результат:
int _tmain(int argc, _TCHAR* argv[])
{
std::string sUniqId ("IndexBuf");
std::stringstream sStream;
sStream << 10;
std::string sUniqId10 (sUniqId);
sUniqId10.append (sStream.str());
size_t uHashStr = std::hash<std::string>()(sUniqId10);
sStream.str("");
sStream << 11;
std::string sUniqId11 (sUniqId);
sUniqId11.append(sStream.str());
size_t uHashStr1 = std::hash<std::string>()(sUniqId11);
sStream.str("");
sStream << 12;
std::string sUniqId12 (sUniqId);
sUniqId12.append(sStream.str());
size_t uHashStr2 = std::hash<std::string>()(sUniqId12);
cout <<"str: " << sUniqId10.c_str() << "\t" << "Hash1: " << uHashStr << endl;
cout <<"str2: " << sUniqId11.c_str() << "\t" << "Hash2: " << uHashStr1 << endl;
cout <<"str3: " << sUniqId12.c_str() << "\t" << "Hash3: " << uHashStr2 << endl;
return 0;
}
вывод:
str: IndexBuf10 Hash1: 1286096800
str2: IndexBuf11 Hash2: 1286096800
str3: IndexBuf12 Hash3: 1286096800
Кто-нибудь знает, почему это происходит?
ps Этот пример корректно работает для msvc2013 update1
Хэши не обязательно должны быть уникальными. Например, во многих алгоритмах первый хэш выбирает "ведро", которое является связанным списком фактических элементов. Скорее всего, хэш-алгоритм изменился между версиями.
Хэш-функции не обязательно должны быть bijective
(взаимно однозначное соответствие, где каждый элемент в области однозначно отображается на элемент в кодемоне). Они должны быть surjective
(каждый элемент в кодемоне имеет соответствующий элемент в области), но не обязательно, чтобы они были injective
, как кажется, вы подразумеваете.
SIZE_MAX
, она просто немного SIZE_MAX
доступное хеш-пространство.
should
быть сюръективным.