1

このコードを使用してハッシュを生成していると仮定します。

static void Main(string[] args) {

    string id = Guid.Parse("8681941A-76C2-4120-BC34-F800B5AAB5A5".ToLower()).ToString();
    string date = DateTime.Today.ToString("yyyy-MM-dd");

    Console.WriteLine(id);
    Console.WriteLine(date);

    using (System.Security.Cryptography.SHA512Managed hashTool = 
        new System.Security.Cryptography.SHA512Managed()) {

        Byte[] PasswordAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(id, date));
        Byte[] EncryptedBytes = hashTool.ComputeHash(PasswordAsByte);
        hashTool.Clear();

        Console.WriteLine(Convert.ToBase64String(EncryptedBytes));

    }
    Console.ReadLine();
}

実際の例では、サンプルに示されているように、GUIDと日付を使用してハッシュを生成します。これらの値をデータベースから取得します。

このアプローチで異なる値で同じハッシュ結果を得ることが可能でしょうか?

編集:

私が示したように、データベースから値を取得します。ご想像のとおり、Guidは一意のIDキーです(奇跡に遭遇せず、SQLサーバーが同じGuidを複数回生成する場合)。また、日時の値は、レコードの支払い期日となります。ここでデモンストレーションを行いましたDateTime.Todayが、これを本番環境で使用することは絶対にありません。

4

3 に答える 3

1

同じ日に複数回プルされた特定のGUIDのハッシュ衝突が確実に発生します。たとえば、特定のGUIDのハッシュを生成する場合、 2012-02-20で12:00にgプルgすると、日付のみが考慮され、考慮されないため、18:00にプルした場合と同じハッシュが生成されます。時間。

無関係なGUIDの場合でも、ハッシュの衝突が発生する可能性があります。可能なハッシュのスペースは64ビットであり、これは無限大未満です。つまり、鳩の巣原理によ​​り、繰り返しが発生する可能性があります。ただし、その可能性は非常に低いです。実際、ゼロとして扱う必要がある可能性は非常に低いです。

于 2012-02-20T22:32:48.223 に答える
0

他のハッシュ関数と同様に、非常にまれにしか発生しない可能性があります。

優れたハッシュ関数は、2つの隣接する入力から異なる結果を生成します。SHA512は優れたハッシュアルゴリズムと見なされているため、この場合は問題になりません。

于 2012-02-20T21:01:03.137 に答える
0

私はそれらすべての議論を理解していませんか?データベースに1,000万のエントリがある場合でも、衝突の可能性は次のようになります。

0.000000000003%(sha256を探したので、sha512の可能性はさらに低くなります)

1億のエントリがある場合でも、心配する必要はありません。本当に確認したい場合は、テキストの間に何かを入れてからハッシュしてください。

$newtext= wordwrap("mytexttexttext", 8, "myspliter", true);
于 2012-05-30T13:57:49.823 に答える