1

こんにちは、memcache を codeigniter アプリケーションに統合しています。ユーザーが選択した値に対するクエリが変更されました。このようなもの

$sql='select * from user where user_name="'.$name.'" and location='".$location."'";
$result = $this->memcached_library->get(md5($sql));
if(!$result ){
       /*  execute query and get $result    */
       $this->memcached_library->add(md5($sql), $result );
}else{
       return $result;
}

これは、異なるクエリごとにキーを処理するための私のアプローチです。しかし、その md5() が常に一意であるとは限らないということを聞いたことがあります。

1> md5()は常に一意ですか?

2> md5() が他のオプションよりも一意でない場合....

3> crc32()はどうですか?

ありがとう....

4

3 に答える 3

4

A.SQLが間違っているはずです

 $sql = "select * from user where user_name = '{$name}' and location = '{$location}'";

B. MD5では大文字と小文字が区別されるため、コードでエラーが発生する可能性があります

見る

var_dump(md5("A"),md5("a"));

出力

string '7fc56270e7a70fa81a5935b72eacbe29' (length=32)
string '0cc175b9c0f1b6a831c399e269772661' (length=32)

より良いアプローチを使用してstrtolower

  $result = $this->memcached_library->get(md5(strtolower($sql)));

C、MD5はユニークですか

MD5は完全な一意性を保証できませんが、32桁の16進値(16 ^ 32)には約3.40282366909387e+38の異なる値があります。つまり、アルゴリズムの背後にある数学が適切な分布を与えると仮定すると、オッズは驚くほど小さく、重複する可能性があります。

D.より良いオプションは使用していますsha1

$betterKey = "user" .  sha1(strtolower($sql));
               ^- identify request for each table
于 2012-09-26T12:44:52.410 に答える
3

MD5はあなたの場合には十分にユニークです。

だが:

私はそれを落とす前にしばらくこの技術を使いました。なんで?

  1. md5は、パスワードハッシュには速すぎると見なされます。ただし、これは依然としてハッシュ関数であり、DBクエリを実行するたびに呼び出されると、コードの速度が低下する可能性があります。過去に、SQLクエリをハッシュしてキーを生成することがPHPの実行時間の20%を占めていることを確認しましたが、これは膨大な時間でした。

  2. 特定のキーを削除または更新する必要がある場合、たとえば、ユーザーが自分の場所を変更したい場合、この変更をできるだけ早く反映させたい場合は、同じDBクエリを再構築し、ハッシュする必要があります。 、キーを取得します。

私が好む解決策:

代わりに、シンプルで短くて便利なキーを作成してください。通常、モデルのメソッド名を使用します。例のメソッドがである場合はUser::getUser($name, $location)、キーを作成します。

$key = "User::getUser($name, $location)"

ハッシュはまったく必要ありません。キーの管理がより明確になり、簡単になります。

于 2012-09-26T12:47:26.637 に答える
0

MD5の衝突の脆弱性について言及しています。実用的で簡単な使用のために、それらを忘れることができます。したがって、MD5( uniqid() ) は一意です。http://php.net/manual/en/function.uniqid.phpを参照してください

SessionID のような使用中のハッシュを生成するには、MD5() が適しています。

于 2012-09-26T12:49:37.507 に答える