配列のキーとしての文字列のMD5ハッシュ

私は、文字列のいくつかの値を持っていると思って、配列をその値を保持するためのいくつかの並べ替えのキーを取得したい: "これはテスト"

$tmpAr['ce114e4501d2f4e2dcea3e17b546f339'] = array("somevar" => "somedata", "morevar" => "moredata");

このようにしたい理由は、どのテキストがキーとして使用されるのか正確にはわからず、問題の可能性のあるすべての部分を取り除くのではなく、ハッシュがそれを処理するからです。

各グループに100文字以下の文字列がある可能性が高いため、重複するキーの可能性は非常に小さいです。

これを使用する際に問題はありますか?

0
「問題の可能性がある断片を取り除く」という意味を明確にしていない。もっと説明してください。特に、ハッシュはデータの小さな変化に非常に敏感です。
追加された 著者 Thilo,
キーとして使用されている文字列に改行があると、予期しない結果が発生する可能性があります。私は、ハッシュを作成するために "悪い"文字をすべて取り除くというのは気に入らない。
追加された 著者 eagle12,
@Thilo - ハッシュは小さな変更に非常に敏感です - 冗談はありません。
追加された 著者 Jared Farrish,
いいえ、おそらくそうではありません。
追加された 著者 Jared Farrish,

1 答え

キーの衝突があるため、これは良い方法ではありません。あなたがウィキペディアから読むことができるように

MD5は衝突耐性ではありません

一般に、ハッシュ関数を使用してキーを作成することは、ピジョンホールの原則のために決して良い選択ではありません。キーの衝突はその配列位置の値の上書きを引き起こし、この動作はデバッグするのが非常に難しくなります。したがって、あなたは深刻な問題と頭痛で走ります。

結論として、私はあなたにあなたのラッパーの一意性を保証する鍵を作成する別の方法を考えることをお勧めします。

3
追加された
必要に応じて、拡張された議論を chat.stackoverflow.com にしてください。
追加された 著者 Sampson,
みんな、このコメントの議論をクリーンアップする、または司会者は...
追加された 著者 Thilo,
@ JaredFarrish:入力文字列自体をキーとして使用すると何が問題になりますか?これらの「問題のある部分」について、なぜ問題があるのか​​、ハッシュがどのように処理するのかについて、より明確にする必要があります。
追加された 著者 Thilo,
問題のあるデータの中には、特殊文字や改行などがあります。ハッシュキーを作成して、配列内で探しているものを簡単に見つけることができ、文字列に基づいたインデックスがわからない限り、一般的なインデックスは機能しません。私は衝突が起こる可能性があることを理解していますが、私はwikiの記事で完全に確信しているわけではありません。そのような小さなデータのサブセットではこれが出てくるでしょう。私は文字列に基づいて配列を調べる必要があり、配列の検索を使用するのが遅すぎるので、他のアイデアを聞くのが大好きです。
追加された 著者 eagle12,
@ティヒロ - 私はそこに何か間違っていると言って覚えていない。レビューでは、「示唆の回答は何ですか?」
追加された 著者 Jared Farrish,
@AurelioDeRosa - 確かに、MD5を使って擬似乱数配列キーを生成するのに間違ったことはないので、私は(少なくともあなたの答えによって)反対側にあります。私が言わなければならないことは、「それ以外には実際にはランダムなことは何ですか?
追加された 著者 Jared Farrish,
私にオッズを教えてください。私にわかりやすく良い方法を教えてください。
追加された 著者 Jared Farrish,
@ティヒロ - 問題はない、自由は乱雑です。
追加された 著者 Jared Farrish,
@AurelioDeRosa - 質問に関する私の元のコメントを参照してください。私は、OPが示唆していることをすることが問題だとは思わない。それが現実さ。
追加された 著者 Jared Farrish,
この質問はDon Quixoteによってあなたにもたらされました。
追加された 著者 Jared Farrish,
@AurelioDeRosa - あなたはあなたの理解にはかなり固執していることは承知していますが、いつか決断を下すことを望むなら、しばしば悪をバランスとバランスさせ、最良の(推測)行くべき正しい道は何ですか? 「地獄、いいえ、これは正しくない」と言っているのは、リーダーの導き方ではないということです。そこから少なくともどこに行くかを示すことができなければなりません。 「それは何であるか」というのは、「これは私が見つけたものであり、これが私がどのように変化に影響を与えているか」を意味することがよくあります。 進捗状況をブロックする方法を教えてください。あなたは進捗状況にどのように影響するかを教えてください。
追加された 著者 Jared Farrish,
配列全体を複雑にするのではなく普通のインデックスを使うだけで、配列のデータを検索する必要がある場合は、実際にPHP上で関数を実行してより高速な結果を得ることができるでしょう。 ;)
追加された 著者 Christopher Pelayo,
私はすでにオプションを提案しており、0から始まる普通のインデックスを使用しています。それはあなたが正しい答えを提供していないと思うならば、あなたがここで質問を起こすのを助けようとしていました。 :)
追加された 著者 Christopher Pelayo,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com