13

一貫性を保つために、データの文字列のチェックサムを生成する必要があることに気づきました。大まかな考え方は、クライアントが受信したペイロードに基づいてチェックサムを再生成し、転送中に発生した破損を検出できるというものです。この種のことの背後にはあらゆる種類の数学的原理があり、自分でロールしようとすると、微妙なエラーがアルゴリズム全体を無効にするのは非常に簡単であることを漠然と認識しています.

そこで、次の基準を持つハッシュ/チェックサム アルゴリズムに関するアドバイスを探しています。

  • Javascript によって生成されるため、比較的軽い計算である必要があります。
  • 検証は Java によって行われます (ただし、これが実際に問題になることはわかりません)。
  • 適度な長さのテキスト入力 (URL エンコードされた Unicode、ASCII だと思います) が必要です。通常は約 200 ~ 300 文字で、すべての場合で 2000 文字未満です。
  • 出力も ASCII テキストである必要があり、短いほど良い結果が得られます。

私は主に、衝突の可能性を最小限に抑えることよりも、軽量なものに関心があります。8 文字のハッシュがこれに適していると想像するのは単純すぎますか? また、検証段階で破損が検出されなかったとしても、世界の終わりではないことを明確にする必要があります (これが 100% 信頼できるわけではないことは認識しています)。すり抜ける不正なエントリ。

編集 - 貢献してくれたすべての人に感謝します。私は Adler32 オプションを使用しましたが、それが Java でネイティブにサポートされていて、Javascript での実装が非常に簡単で、両端での計算が速く、8 バイトの出力があることを考えると、私の要件にぴったりでした。

(ネットワーク トランスポートが破損エラーの原因である可能性は低いことを認識しており、この問題についてはまだ腕を組んでいないことに注意してください。ただし、チェックサム検証を追加すると、障害点が 1 つ取り除かれ、他の領域に集中できるようになります。これが再発する場合。)

4

9 に答える 9

14

CRC32 は、どの言語でも実装するのがそれほど難しくありません。単純なデータの破損を検出するには十分であり、適切に実装すると非常に高速です。ただし、CRC32 とほぼ同等に優れた Adler32 を試すこともできますが、実装はさらに簡単です (そしてほぼ同等に高速です)。

ウィキペディアの Adler32

CRC32 JavaScript 実装サンプル

これら 2 つのいずれか (あるいは両方) は、Java でそのまま使用できます。

于 2009-01-07T18:28:59.827 に答える
6

TCP と UDP (および IP、イーサネットなど) の両方が、転送中のデータにチェックサム保護を既に提供していることを認識していますか?

本当に奇妙なことをしていない限り、破損が見られる場合は、何かが非常に間違っています。メモリテスターから始めることをお勧めします。

また、SSL/TLS を使用すると、データの整合性を強力に保護できます。

于 2009-01-07T19:13:41.890 に答える
2

他の人はすでに CRC32 について言及していますが、CRC 実装を参照する数少ない有名で評判の良いサイトの 1 つとして、PNG 用の CRC-32 の W3C 実装へのリンクを次に示します。

(数年前、私は CRC アルゴリズムを使用した有名なサイト、またはそのアルゴリズムのソースを引用している少なくとも 1 つのサイトを見つけようとしましたが、PNG ページが見つかるまで、ほとんど髪を引き裂かれていました。)

于 2009-01-07T20:12:09.137 に答える
2

[2013 年 5 月 30 日更新: 古い JS CRC32 実装へのリンクが切れたので、別のものにリンクしました。]

Google CRC32: 高速で、MD5 などよりもはるかに軽量です。ここに Javascript の実装があります。

于 2009-01-07T18:27:44.307 に答える
2

MD4、MD5、および SHA1 の Javascript 実装。BSD ライセンス。

于 2009-01-07T18:30:52.427 に答える
1

これは私が「発明した」比較的単純なものです-その背後にある数学的研究はありませんが、それは非常に高速で実際に機能します。また、アルゴリズムをテストし、失敗の可能性が10,000,000分の1未満であることを示すJavaの同等物も含めました(実行には1〜2分かかります)。

JavaScript

function getCrc(s) {
    var result = 0;
    for(var i = 0; i < s.length; i++) {
        var c = s.charCodeAt(i);
        result = (result << 1) ^ c;
    }
    return result;
}

Java

package test;

import java.util.*;

public class SimpleCrc {

    public static void main(String[] args) {
        final Random randomGenerator = new Random();
        int lastCrc = -1;
        int dupes = 0;
        for(int i = 0; i < 10000000; i++) {
            final StringBuilder sb = new StringBuilder();
            for(int j = 0; j < 1000; j++) {
                final char c = (char)(randomGenerator.nextInt(128 - 32) + 32);
                sb.append(c);
            }
            final int crc = crc(sb.toString());
            if(lastCrc == crc) {
                dupes++;
            }
            lastCrc = crc;
        }
        System.out.println("Dupes: " + dupes);
    }

    public static int crc(String string) {
        int result = 0;
        for(final char c : string.toCharArray()) {
            result = (result << 1) ^ c;
        }
        return result;
    }
}
于 2012-11-16T09:19:42.990 に答える
1

SHA-1 JS 実装を使用します。思ったほど遅くはありません (Core 2 Duo 2.4Ghz 上の Firefox 3.0 は 1 秒あたり 100KB を超えてハッシュします)。

于 2009-01-07T18:27:14.200 に答える