4

私のMySQLDBには、次のように定義されたテーブルがあります。

CREATE TABLE `mytablex_cs` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `tag` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT '',
  `value` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  KEY `kt` (`tag`),
  KEY `kv` (`value`(200))
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

フィールドにUNIQUE制約(キー)を実装する必要がありvalueます。

blobまたはフィールドの値全体に一意のインデックスを定義することはまだ不可能ですが、textそのような機能を実装するために開かれたチケット(?)があり(このページを参照)、を使用して一意のキーを作成することが提案されています他のフィールドにはすでに実装されているようなハッシュ。

次に、同様のアプローチを使用して、ハッシュを含む別のフィールドをテーブルに追加し、このフィールドに一意のキーを作成します。

このハッシュを作成するための可能な方法を検討しましたが、衝突を回避したいので(数百万のエントリを挿入する必要があります)、クイック検索で得られたとしても、RIPEMD-160アルゴリズムが最適なようです。 SHA256またはSHA1とMD5を使用するいくつかの同様のソリューション。

私は暗号化の知識がまったくないので、このアプローチを選択することの欠点は何ですか?

私が持っているもう1つの質問は、ハッシュを作成するためにMySQLが現在使用しているアルゴリズムはどれかということです。

4

1 に答える 1

8

要件を見てみましょう。

値フィールドが一意であることを確認する必要があります。値フィールドはテキスト列であり、その性質上、値フィールドに一意のインデックスを作成する方法はありません(現時点では)。したがって、フィールド値のハッシュである追加のフィールドを使用することが、ここでの唯一の実際のオプションです。

このアプローチの利点:

  1. ハッシュの計算が簡単です。
  2. 2つの異なる値に対して重複するハッシュを作成することは非常にまれであるため、ハッシュ値がunqiueであることがほぼ保証されます。
  3. ハッシュは通常、効率的にインデックス付けできる数値(16進数で表される)です。
  4. ハッシュは多くのスペースを占有しません。異なるハッシュ関数は異なる長さのハッシュを返すため、さまざまなアルゴリズムを試して、ニーズに合ったものを見つけるためにテストしてください。

このアプローチのデメリット:

  1. INSERTSおよびUPDATES中に対応する追加のフィールド。つまり、実行する作業がさらにあります。
  2. テーブルにすでにデータがあり、これが本番環境にある場合は、現在のデータを更新する必要があります。できれば、重複がないことを願っています。また、アップデートの実行にも時間がかかります。したがって、すでに機能しているシステムに変更を適用するのは難しいかもしれません。
  3. ハッシュ関数はCPUを集中的に使用し、CPU使用率に悪影響を与える可能性があります。

ハッシュ関数が何をするのか、そして概念的にどのように機能するのかを理解していると思います。

暗号化関数のリストはここにあります:http://dev.mysql.com/doc/refman/5.5/en//encryption-functions.html

MySQLは、私が知る限り、MD5、SHA、SHA1、およびSHA2ハッシュ関数をサポートしています。これらのすべてではないにしても、ほとんどはハッシュだけで十分なはずです。MD5のような一部の関数は、暗号化アプリケーションで使用する場合、つまりPKIで署名アルゴリズムとして使用する場合などに問題があります。ただし、実際には適用されていないため、MD5を使用して一意の値を作成する場合は、これらの問題はそれほど重要ではありません。ここで暗号化のコンテキストで。

MySQLハッシュ関数を使用するには、次の例を試すことができます。

SELECT MD5('1234')
SELECT SHA('1234')
SELECT SHA1('1234')
SELECT SHA2('1234',224);

すべての新しいものと同様に、すべてのアプローチを試して、自分のケースで最も成功するアプローチを見つける必要があります。

于 2012-10-03T07:40:00.257 に答える