ハッシュ< char *> STLの関数はchar *とsize_tの間の1-1マッピングを提供しますか?

StackOverflow https://stackoverflow.com/questions/1817807

  •  08-07-2019
  •  | 
  •  

質問

ペアを持っています 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);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top