、それが固定されたドメインに機能マッピング任意の長さの文字列を構築することはできません。これはpigeonhole principleに違反しています。
次の提案がかなり複雑に思えるが、あなたの問題へのより大きな文脈の欠如与えられ、ここに行く...
は、あなたがそう
として、すべてのあなたの名前を実行するを通じてクラスを構築すると仮定
これは、シードを取るctorと、名前文字列を取って8文字のキー文字列を返すことの2つのメンバーを持っています。コードでは、このオブジェクトをいくつかの固定された任意のシードで初期化します。
内部的には、クラスオブジェクトは、適用された個別の名前ごとに、マップされたキーであるunordered_map
のマッピングを保持する必要があります。最初は明らかに、この内部のunordered_map
は空になります。
クラスオブジェクトは、コンストラクタのseed
によって疑似ランダムに選択されたuniversal hash functionを使用する必要があります。ユニバーサルハッシュ関数を作成する1つの方法については、this questionへの回答を参照してください。
オペレータが呼び出されると、その名前が内部にあるかどうかを確認する必要がありますunordered_map
。そうであれば、見つかったキーを返します。それ以外の場合は、まずハッシュ関数を使用してキーを計算し、内部のunordered_map
に配置します。ただし、新しいキーを生成する場合は、既存のキーと衝突するかどうかを確認し、存在する場合は例外をスローします。各個別の名前がtypeid
を呼び出すコード内の場所に対応しているので
現実的に言えば、明確な名前の数は、Nが高々、1000年代にあるべきと言います。 mを8文字(2 )の可能な範囲に設定します。
衝突の確率は、小さなであるべき、〜N /(2M)あります。したがって、ほとんどの場合、衝突はなく、例外もスローされません。しかし、投げられた場合は、種を変え、プログラムを再構築してください。あなたがそれをしなければならないと予想される回数(最初の時間の後)は0に近いです。
圧縮アルゴリズムを見つける必要があるようです。それが可能かどうかわからない。 – alain
これは[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)とよく似ています。 – molbdnilo
@molbdniloもしあなたがtypeidを使う以外の方法を知っていれば、私は知っていて嬉しいです。 –