3

私が得ている結果は、同じタイプのファイルが同じ md5 ハッシュ値を返しているということです。たとえば、2 つの異なる jpg で同じ結果が得られます。ただし、jpg と apk では結果が異なります。

これが私のコードです...

public static String checkHashURL(String input) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        InputStream is = new URL(input).openStream();

        try {
            is = new DigestInputStream(is, md);

            int b;

            while ((b = is.read()) > 0) {
                ;
            }
        } finally {
            is.close();
        }
        byte[] digest = md.digest();
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < digest.length; i++) {
            sb.append(
                    Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(
                            1));
        }
        return sb.toString();

    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}
4

1 に答える 1

5

これは壊れています:

while ((b = is.read()) > 0)

コードは、ストリームの最初のバイトである 0 で停止します。2 つのファイルの最初の 0 バイトの前に同じ値がある場合、失敗します。一度に 1 バイトずつバージョンのを本当に呼び出したい場合は、次のreadようにします。

while (is.read() != -1) {}

パラメータなしInputStream.read()のメソッドは、ストリームの最後に到達すると -1 を返します。

(使用していないため、 に値を割り当てる必要はありbません。)

一度にバッファを読み取る方が良いでしょう:

byte[] ignoredBuffer = new byte[8 * 1024]; // Up to 8K per read
while (is.read(ignoredBuffer) > 0) {}

InputStream.read(byte[])空のバッファを渡した場合にのみ 0 が返されるため、今回は条件が有効です。それ以外の場合は、少なくとも 1 バイトの読み取りを試み、読み取ったデータの長さを返すか、ストリームの終わりに達した場合は -1 を返します。

于 2012-11-14T18:13:35.093 に答える