8

ローカル ファイルの MD5 を取得しましたが、Amazon S3 の「同じ」ファイルの MD5 (eTag) とは異なります。私が達成したいのは、S3 にある最新のファイルがローカルにあるファイルと同じかどうかを調べることです。MD5 を比較できない場合、どうすればよいですか?

ローカル ファイルから MD5 を生成する (切り捨てられたコード):

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5 = Files.getDigest(localFile, md);
String hashtext = DigestUtils.md5Hex(md5);

S3 から MD5 (eTag) を取得する (切り捨てられたコード):

ObjectListing objectListing = s3.listObjects(new ListObjectsRequest().withBucketName(bucketName));
List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
for(S3ObjectSummary objectSummary : objectSummaries) {
    String MD5 = objectSummary.getETag();
}

PS: 私はライブラリを使用org.apache.commons.codec.digest.DigestUtilsします。com.google.common.io.Files

4

4 に答える 4

13
String hashtext = DigestUtils.md5Hex(md5);

計算したMD5のMD5を計算しますか。DigestUtils.md5Hexのドキュメントを参照してください。

hashtext実際にはMD5(ファイル))であり、MD5(ファイル)ではありません。

于 2011-06-06T21:04:34.557 に答える
3

ブルーノの答えはそれを釘付けにしますが、Google Guava への依存関係なしでこれを実行したい場合、実際にはそれほど難しくないことを指摘したいと思います (特に、Apache Commons を使用している場合)。

これを置き換えます:

byte[] md5 = Files.getDigest(localFile, md);

これで(Java 7のtry-initialization-blockを使用):

try (FileInputStream fis = new FileInputStream(localFile)) {
    byte[]md5 = DigestUtils.md5(fileInputStream);
}

このmd5(InputStream) メソッドは、バージョン 1.4 から Apache Commons に含まれています。

于 2012-03-13T11:30:00.963 に答える