2

一意の文字列値の列を持つテーブルがあります。文字列値の最大長は 255 文字です。文字列値を入力として一意の ID を生成したいと考えています。言い換えれば、文字列のコンパクトな表現を探しています。生成される一意の ID は、英数字にすることができます。あると便利な機能は、一意の ID から文字列値を再生成できることです。

このような一意の ID を生成する効率的な関数はありますか。チェックサムまたはハッシュ関数を使用する方法もあります。これを行う標準的な方法があるかどうか知りたいです。

MySql データベースと Java を使用しています。

ありがとう!

--edit: 文字列自体を使用するのではなく、よりコンパクトな表現を探しています。

4

8 に答える 8

4

「ユニーク」とはどのくらいユニークですか?任意の優れたハッシュ関数 (MD5 はほとんどの用途に適切であり、java.security.MessageDigest.getInstance("MD5") を介して簡単に実装できます) を使用すると、一意である可能性が非常に高い 128 ビットの数値を取得できます。ハッシュはより小さな ID を取得し、衝突の可能性が高くなります。

DB で auto_increment フィールドを使用すると、それが設計に適合する場合、実装がより簡単になる可能性があり、真に一意性が保証され、MD5 の 16 バイトよりも小さい ID が使用されます。また、ハッシュではできないキーで文字列を見つけるという要件を満たすこともできます。

于 2010-02-03T18:50:07.717 に答える
2

これは圧縮に関連しています。最も簡単な方法は、ビットパックして各文字を最小限のビット数にすることです。

AZ は 26 文字で、32 (5 ビット) 未満です。

az を追加すると、6 ビットになります (他の文字を表すために約 12 のビットパターンが残っています)。

それで十分だとしましょう。したがって、文字列を格納するための 1530 ビットである 6x255 ビットがあります。(191バイト)

大文字のみを使用すると、それが少し減少します(159バイトまで)

さらに最適化することもできますが、その場合、文字列内の特定の言語またはパターンを想定し、それらのパターンを最適化する圧縮アルゴリズムに入る必要があります。

文字列の内容をさらに指定できない限り、必要なものを取得することはできません。ごめん。(文字列の内容について詳しく教えていただける場合は、そうしてください。私たちの 1 人が、より優れた「圧縮」を可能にするパターンを見つけるかもしれません)

やりたいことを実行できないことが、ハッシュテーブルが優れている理由です。彼らは「最もユニークな」番号を取得し、2 つの文字列が同じ番号にハッシュされるケースをテストするための第 2 レベルの解決策を持っています。

于 2010-02-03T18:53:40.470 に答える
1

データベースで列に一意の値が含まれている必要がある場合は、文字列自体を使用してみませんか?それ以外のものは、それをエンコード/デコードするための単なる別のステップです。

于 2010-02-03T18:14:02.210 に答える
1

MySQLを使用しているので、CRC32を見てください

http://www.bitbybit.dk/carsten/blog/?p=191

于 2010-02-03T19:09:25.907 に答える
1

255 の長さの文字列には、64 (またはその他) ビットの長さの数値よりもはるかに多くの可能性があります。それは無理だ。auto_increment フィールドを追加します。

于 2010-02-03T18:36:14.047 に答える
0

適切なキーを選択するのは簡単ではありません。

あなたは考慮する必要があります:

  • レプリケーション:異なるサーバー間でキーを共有する必要がありますか?もしそうなら、あなたはおそらくある種のユニークなハッシュまたはGUIDを必要とします。

  • テーブルのサイズ/挿入の数:ほとんどのrdbmsは、(クラスター化された)主キーの順序でデータをハードドライブに物理的に格納することを考慮する必要があります。ここで、適切なサイズのテーブルに「a」で始まるハッシュ値を挿入するとどうなるか想像してみてください。はい、インデックスのパディングがありますが、最終的には完全で1行の挿入により、ハードドライブ上で数GBの移動が発生する可能性があります。

  • レプリケーションが必要で、大きなテーブルがありますか?両方を使う。プライマリクラスター化自動インクリメント(ロング)整数キーを使用し、ハッシュ列に一意のインデックスを定義します。

于 2012-08-30T15:56:29.607 に答える
0

頻繁に発生する文字列の数が限られている場合は、数値 (自動インクリメント) ID を持つ参照テーブルを作成し、メイン テーブルにその参照テーブルへの FK を作成することもできます。

そうでない場合、オリジナルを取得する必要がある場合は、GZIP またはその他の圧縮アルゴリズムを介して文字列を実行できます。

オリジナルを取得する必要がない場合は、MD5 などのハッシュ関数を探しています。

于 2010-02-03T18:42:37.420 に答える
0
public String getUniqueId(String uniqueString) {
    return uniqueString;
}

ID に「一意であること」以外の制約がない限り。

于 2010-02-03T18:09:27.543 に答える