ハッシュ< char *> STLの関数はchar *とsize_tの間の1-1マッピングを提供しますか?
質問
ペアを持っています
pair.firstの値は1000を超えることはできません。
また、文字列であるpair.secondが常に1ワードであることも知っています。 1ワードを超えないでください。
そのため、ペアのハッシュ値を作成するために、次のことを行っています。
pair<int,string> p;
hash<char*> H;
hash_vale = H(p.second)*1000 + p.first;
文字列のハッシュ値があまり大きくなく、H(p.second)が1-1のマッピングを与える限り、これは一意の値を与えると思います。これらの仮定は有効ですか?
ありがとう、
解決
定義により、鳩の巣の原理により、ハッシュは1対1にはできません。つまり、ハッシュ値は2 ^ 32個ありますが、文字列ははるかに多くあります。したがって、同じハッシュ値を持つ2つの文字列が必要です。
2番目に、ハッシュは32ビットすべてを使用する必要があるため、ハッシュ値に1000を掛けることでほぼ確実にオーバーフローを引き起こしています。 intをハッシュし、ハッシュを混合する方がはるかに良いです。 Boostには hash_combine
関数があります:a + 0x9e3779b9 +(b&lt;&lt; 6)+(b&gt;&gt; 2);
所属していません StackOverflow