1

最近、コードを使用しintてクラスの一意の番号を作成しています。

reinterpret_cast<int>(my_unique_name)wheremy_unique_namechar []一意の値を持つ変数を使用しました。以下のようなもの:

const char my_unique_name[] = "test1234";

int generate_unique_id_from_string(const char *str)
{
  return reinterpret_cast<int>(str);
}

私の質問は、生成されたすべてのエントリ文字列に対してint本当に一意ですか?

4

3 に答える 3

7

いいえそうではありません。文字列の内容ではなく、文字列のアドレスをキャストしています。

文字列入力に基づいて数値を作成するには、ハッシュ関数を使用します。ただし、いわゆる鳩の巣原理のため、これは真に一意の番号を作成しません。

于 2011-10-09T08:20:45.407 に答える
3

状況によります。これがあなたの質問の私の解釈です:

文字列ごとに異なる番号を割り当てようとしています。また、異なるソースからの同一の文字列は異なるIDを持ちます。

ケース1:

strどこからでもそれらの文字列を読み取るために使用する再利用可能なバッファである場合。そうすれば、それらはすべて同じベースアドレスを持つことになります。したがって、それは一意ではありません。

ケース2:

strたまたまヒープに割り当てられた文字列です。さらに、ID化されるすべての文字列の有効期間は重複しています。そうです、IDはすべてメモリ内の異なるアドレスに同時に存在するため、一意になります。

編集:

一意のIDを生成したいが、同じ文字列に同じIDを持たせたい場合は、ハッシュ関数に関するGregの回答を参照してください。

于 2011-10-09T08:23:44.937 に答える
0

常に一意であるとは限りませんが、

id1 = generate_unique_id_from_string("test12344444444444444");
id2 = generate_unique_id_from_string("Test12344444444444444");

また、これはプラットフォームのエンディアンに依存すると思います。

于 2011-10-09T08:21:27.760 に答える