2012-03-21 10 views
1

私はWWWフレームワークでAPI呼び出しをたくさんキャッシュしてバッファリングしています。既に作成されたAPI呼び出しを検出するだけでなく、キャッシュファイル名と一致させるために、「フィンガープリンティング」データを使用します。配列を指紋採取する最速の方法(データの配列からユニークなハッシュを計算する)

多くのデータがGET、POSTなどのように配列に移動されます。その結果、API呼び出しの一意性はデータに依存します。

この結果、私はこの情報を指紋採取する必要があります。これを行うには、データ配列から「指紋」を生成し、それを保存して比較できる文字列にハッシングする必要があります。

配列のシリアル化には、PHPでserialize()とjson_encode()があります。さまざまなベンチマークの後、私はjson_encode()を配列をシリアライズするためのより速いメソッドと見なし、それにとても満足しています。

ハッシュには、md5()とsha1()関数があり、そのうちのmd5()はベンチマークによって高速です。

だから私の現在の指紋アルゴリズムは次のとおりです。

$fingerprint=md5(json_encode($array)); 

しかし、私は、これはPHPの配列をフィンガープリントのための「最速」メソッドであるかどうか疑問を持っています。私はGoogleとStackOverflowを試してみましたが、良い選択肢は見つかりませんでした。私は正しい道を歩いているのですか、私は別の何かをする必要がありますか?

+1

md5(var_export($ data、true))はどのように比較されますか?また、 'json_encode'によって保存される順序に頼ることができるかどうか疑問です。キーの順序が異なるため、キャッシュを逃すのは悪いことです。 – Hamish

+2

var_export()はserialize()より高速ですが、私のテストではjson_encode()よりも遅いです。私はmd5()を置き換えるcrc32()を探しています、テストする必要があります。 – kingmaple

+0

まあ、明らかに(私の驚きに)crc32()は実際にはmd5()よりも遅く、もちろん衝突の可能性がより高くなります。だから私は以前md5(json_encode($ array))にあったところに戻ります。 – kingmaple

答えて

3

あなたの配列がjson_encodedになったら、主に速度に関心を持つ場合は、おそらく非サイクリックハッシュ関数を使うべきです。異なるハッシュ関数は異なるものに適しています。 MD5とSha1は暗号化と呼ばれます。なぜなら、それらは元に戻すことが難しいからです(脆弱性のためセキュリティ上の目的で広く推奨されていないと考えられています)。 CRC(巡回冗長検査)機能はエラー検出コードであり、いずれにしても一意性には適していません。

ウィキペディアは、寄稿者が一般的にライブラリ実装への外部リンクを持っている場合にのみ、これを開始するためのまともな場所です。 List of hash functionsそこには非暗号化ライブラリのいくつかを読んでベンチマークすることをお勧めします。非暗号化機能は、スピードと妥当な一意性のために、セキュリティ、エラー検出、その他の興味深いプロパティを犠牲にして記述されています。

あなたが主にスピードを心配している場合は、指紋を保存して比較する方法があります。 MD5は、128ビットのデータを出力します。これは、ライブラリの呼び出しやオーバーヘッドがなくても、phpの数値型には適合しません。私のお金のために、私はあなたが比較とストレージの最高の速度を得ることができると確信しています64ビット数値を直接出力できるハッシュ関数から来るだろう。 64ビット数値をネイティブにphpで取得するには、64ビットハードウェアを用意し、phpを64ビットモードで設定/インストールする必要があります。私はここであなたが興味を持っているなら私がおそらく掘り下げることができる私たちのステージングとプロダクト環境をテストするために使用したコードをいくつか持っています。

Btw、私はあなたがjson-encodeよりも速い配列の文字列化を得るつもりはないと思います。その問題の核心は配列のウォーキングと文字列の操作です。したがって、基本的に速度は出力の冗長性に比例します。 JSON-encodeはPHPのシリアライズ関数やエクスポート関数に比べて非常に簡潔です。私はあなたがPHPのドキュメントのページで十分なコメントを見て、直接入力として配列を取るハッシュ関数を書いた人を見つけることができるだろうが、それはまったく良いかどうかはギャンブルになるだろう。

私は何かについてはっきりとわかりません。

+0

最高の答えではありませんが、状況を考えれば十分です。ご協力いただきありがとうございます! – kingmaple

+3

ここでの唯一の事情は、私はそれが最高の答えだと言っています。 – tiwo

関連する問題