3

一連の (スマート) ポインターをハッシュ セットに格納したい<boost/unordered_set>。10 秒考えた後、次のハッシュ関数を思いつきました。

typedef boost::shared_ptr<myType> ref_t;
struct SharedPtrHash : public std::unary_function<ref_t, std::size_t> {                        
    std::size_t operator()(ref_t const& obj) const {
      return reinterpret_cast<std::size_t>( obj.get() );
    }
};

私の質問は: このハッシュは良い考えですか? 私は、このハッシュの衝突がゼロまたは非常に少ないという考えを楽しんでいます(おそらく、ボンネットの下にいくつかの素数モジュラスがあり、私の楽しみがすべて台無しになっています)。

意図的な詳細:ハッシュの目的は、大きなオブジェクトのストレージをリサイクルすることです。そのため、大きなオブジェクトが既にビンにあるかどうかをすばやく検出する方法が必要です。

そうでない場合、スマートまたはダムのいずれかのポインターの理想的なハッシュは何でしょうか?

4

3 に答える 3

1

次のコードは完全にコンパイルされます (GCC 4.7、Boost 1.47):

#include <boost/unordered_set.hpp>
#include <boost/shared_ptr.hpp>

struct Foo { };

int main()
{
  boost::unordered_set<boost::shared_ptr<int>> s;
  boost::shared_ptr<int> pi(new int);
  s.insert(pi);

  boost::unordered_set<boost::shared_ptr<Foo>> t;
  boost::shared_ptr<Foo> pf(new Foo);
  t.insert(pf);
}
于 2011-10-18T22:26:11.237 に答える
0

整数型のデフォルトのBoost.Hash hash関数は恒等関数なので、ポインターに対して同じことをするのは悪い考えではないと思います。同じ衝突率になります。

于 2011-10-18T22:26:30.420 に答える