4

Mysqlテーブルの各行にランダムで一意のIDを割り当てる必要があります。行に同じ値が含まれている場合、IDは同じである必要があります。

つまり、1行目に[hi、hello、bye]が含まれ、2行目に[gg、hello、bye]が含まれ、3行目に[hi、hello、bye]が含まれる場合、1行目と3行目は同じIDを生成し、2行目は生成する必要があります。別のID。

前もって感謝します。

4

4 に答える 4

3

MD5ハッシュが機能する可能性があります。以下は、更新が必要な切り刻まれたクイック/ダーティコードですが、概念を証明しています。

System.out.println("row1=" + test1 + ":" + tst1.getHash(test1));
System.out.println("row2=" + test2 + ":" + tst1.getHash(test2));
System.out.println("row3=" + test3 + ":" + tst1.getHash(test3));

private String getHash(String inputStr){
    try{
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(inputStr.getBytes());
        byte byteData[] = md.digest();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < byteData.length; i++) {
         sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
    }
    catch(Exception e)
    {
        e.printStackTrace();
        return null;
    }
}

row1=hi,hello,bye:cfe40e96aa052a484208c2aefb6f39bb
row2=gg,hello,bye:f652785f0e214507e6aea44ecd3ffb7a
row3=hi,hello,bye:cfe40e96aa052a484208c2aefb6f39bb
于 2013-03-05T05:31:23.427 に答える
1
SELECT CRC32(CONCAT(column1, column2, column3)) FROM MyTable.

技術的には、CRC32はランダムではありません(しかし、何ですか?)-そして、衝突(同じ整数にマッピングされる異なる値)を生成する可能性はわずかです。しかし、それは始まりです。

于 2013-03-05T05:19:06.303 に答える
0

衝突が発生しないことを本当に証明したい場合は、フィールドに含まれていないセパレータを使用して、すべてのフィールドを連結することになります。もちろん、これは通常、非常に長くて扱いにくいものになります。

誰もが通常行うことは、ハッシュ関数でその文字列をフィードすることです。理論的には一意ではありませんが、十分に大きな結果が得られる適切なハッシュ関数を考えると、人類の生存中に衝突を引き起こす可能性が低いハッシュ関数を見つけることができるはずです。たとえば、gitはそのようなハッシュ(sha1)を使用しており、LinusTorvaldsは偶発的な衝突の可能性について次のように書いています。

まず、不注意による衝突は本当にありそうもないことを人々に思い出させてくださいそのため、宇宙の完全な歴史の中でそれを目にすることはほとんどないでしょう。

別のことは、それほど偶然ではない衝突です。最初に、開始する文字列が異なる列で同じでないことを確認する必要があります。これの意味は:

  • すべての列が含まれていることを確認してください
  • 列自体に含まれていないもので区切られた列を確認してください。必要に応じてエスケープを使用します。たとえば、2つの列を連結するだけの場合、値'abc'+'def'は'a'+'bcdef'と同じ結果になります。

標的型攻撃について心配する必要がある場合、つまり誰かが実際に同じハッシュでエントリを作成しようとしている場合、ブルートを防ぐために、暗号化ハッシュを使用するのが最善の策です。強制攻撃。もちろん、これはほとんどのアプリケーションが可能な限り高速であるという要件と衝突する可能性があります。

于 2013-03-05T06:05:27.097 に答える
0

必要なのは、気になるすべての値を連続してハッシュする関数です。定義上、決定論的でなければならないため、ランダムにすることはできません。同じ値を指定すると、常に同じIDを取得します。「ランダム」とは「シーケンシャルではない」という意味の場合、ほとんどのハッシュ関数がこのニーズを満たす必要があります。

理論的には、衝突の可能性が常にあるため、一意性を保証することはできません。つまり、IDが異なるということは、行の値が異なることを意味しますが、その逆は常に正しいとは限りません。必要に応じて、一致するIDが検出されるたびに、実際の行の値に明示的な一致を実装することをお勧めします。MD5やSHA1のような暗号化ハッシュ関数の使用を検討し、自分の側にある確率に依存することもできます(実際、暗号化ハッシュ関数を使用して見つけた衝突は、この分野でのある種の突破口になります)。

于 2013-03-05T06:07:23.990 に答える