は、私はこのように、直列化インタフェースを介して、指定されたオブジェクトのためにSHA1を生成する必要があります。ハッシュテーブル用のコンテンツsha1を生成する方法は?私のプロジェクトで
class sha1_sink : public isink{...};
sha1_sink sink;
serialize(sink, obj);
return sink.get_digest();
シリアル化はテンプレート関数であり、異なるタイプのため、オーバーロード。
ハッシュテーブルを除いて、ほとんどの場合うまくいきます。
オブジェクトAがBと同じ内容の場合、同じsha1を持つはずです。順序はハッシュテーブルにとって無意味です。したがって、ハッシュテーブルAとBが同じ要素を持ちますが、順序が異なる場合、それらは同じとみなされます。
1つの解決策は、関数の呼び出しを最初にソートすることですが、明らかに遅くて余分なメモリが必要です。
シリアライズする前に負荷係数を既定値(0.5など)に設定して再ハッシュすることができます。ハッシュテーブルを調整する必要がある場合でも、要素の順序は安定していると思います。
しかし、私は上記のどれも十分ではないと思うし、もっと良い解決策を模索したいと思っています。私は、誰かが正しい道に乗る方法を私に見せることができれば、とても感謝しています。
ハッシュテーブルの場合は、std :: unordered_map/setと同様に汎用コンテナです。
最悪の場合、ハッシュテーブルにはいくつの要素がありますか? –
私は10kが私のプロジェクトで合理的な仮定だと思います。 – wingfire
なぜこれを[tag:git]にクロス投稿したのか分かりませんが、いくつかの点で同様の問題があるGitの 'tree'オブジェクトは常にソートされたインデックス*つまり、Gitは「ハッシュテーブルをソートしたままにする」アプローチを採用しています。これは、データベース内のオブジェクトとしてツリー*が存在すると、決して変更できないため、Gitにとっては問題ありません。ソート作業は他の場所で行われ、そのコストはインデックスの他の用途よりも償却されます。 – torek