int的哈希值是相同的数字

时间:2013-11-01 20:28:31

标签: c++ hash stl

为什么哈希将本身作为哈希值返回?

我已经并排设置了哈希和哈希, 并且字符串中的一个按预期工作,而int将其自身生成为哈希值!

它应该如何运作?

hash<int> h;
for( int i=0 ; i<15 ; ++i )
{
    cout << "int hash for " << i << " is " << h(i) << endl; 
}

hash<string> hs;
for( int i=0; i<15; ++i) {
    stringstream ss;
    ss << i;
    cout << "string hash for " << i << " is " << hs(ss.str()) << endl; 
}

,结果是

+ g++-4.8 -std=c++11 -O2 -Wall -pedantic -Weffc++ -Wextra main.cpp
+ ./a.out
int hash for 0 is 0
int hash for 1 is 1
int hash for 2 is 2
int hash for 3 is 3
int hash for 4 is 4
int hash for 5 is 5
int hash for 6 is 6
int hash for 7 is 7
int hash for 8 is 8
int hash for 9 is 9
int hash for 10 is 10
int hash for 11 is 11
int hash for 12 is 12
int hash for 13 is 13
int hash for 14 is 14
string hash for 0 is 2297668033614959926
string hash for 1 is 10159970873491820195
string hash for 2 is 4551451650890805270
string hash for 3 is 8248777770799913213
string hash for 4 is 16215888864653804456
string hash for 5 is 7995238595416485409
string hash for 6 is 3835993668518112351
string hash for 7 is 905566266843721762
string hash for 8 is 17899137375351314596
string hash for 9 is 6623666755989985924
string hash for 10 is 2594088158685378223
string hash for 11 is 9717255990760309898
string hash for 12 is 11194622142508650503
string hash for 13 is 15638310844945205280
string hash for 14 is 1116181219906060362

你可以看到它正在运行: http://coliru.stacked-crooked.com/a/0c0e1536d19c533f

5 个答案:

答案 0 :(得分:8)

  

为什么hash会将自身返回为哈希值?

非常直率,因为它可以。这是最有效的方法,它为整数提供了一个完美的哈希函数。你根本无法做到更好!

答案 1 :(得分:3)

不要将对象的哈希值与您可能存储在其中的哈希中的槽索引混淆。哈希值只是对给定输入值的近似唯一数值的最佳尝试。 / p>

您的代码演示的是,对于您散列的每个整数值,返回了唯一的哈希值。

这是一个理想的哈希函数。

std::hash<int, std::string> hashTable;

hashTable[42] = "hello";

42的哈希值是42.但是这个哈希中可能没有42个桶。 operator[]在这里被重载,并且将通过散列分布(桶数)约束hash value以确定将您放入哪个插槽。

key = 42
hashValue = 42
hashKey = 42 % m_bucket.size() // which bucket to look for this key in

答案 2 :(得分:2)

是的,它应该如何运作。 hash函数返回一个整数,输入是一个整数,所以只返回输入值就会产生散列类型可能最独特的散列。

答案 3 :(得分:2)

散列函数是从值到固定大小值的内射映射。如果源域和目标域相同,则认为身份是合理的选择。

答案 4 :(得分:1)

哈希函数必须为相同的输入生成相同的size_t - 类型值,并尽量为不同的输入返回不同的值。对于最大宽度为size_t的整数,整数本身满足这些要求并且计算成本低廉。