0

1000枚の2MBの写真を保持する特定のディレクトリのすべてのファイルをハッシュ(MD5)したいと思います。forループを実行して一度にファイルをハッシュしようとしましたが、メモリの問題が発生しました。

各ファイルを効率的な方法で(メモリに関して)ハッシュする方法が必要です。

問題について 3 つの質問を投稿しましたが、コードを修正する代わりに、要件に対する一般的な最善のアプローチを確認したいと考えています。

助けてくれてありがとう。

public class MD5 {

public static void main(String[] args) throws IOException {
    File file = new File("/Users/itaihay/Desktop/test");
    for (File f : file.listFiles()) {
        try {
            model.MD5.hash(f);
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }
    }

private static MessageDigest md;
private static BufferedInputStream fis;
private static byte[] dataBytes;
private static byte[] mdbytes;

private static void clean() throws NoSuchAlgorithmException {
    md = MessageDigest.getInstance("MD5");
    dataBytes = new byte[8192];
}
public static void hash(File file) {
    try {
        clean();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        fis = new BufferedInputStream(new FileInputStream(file));
        int nread = 0;
        while ((nread = fis.read(dataBytes)) != -1) {
            md.update(dataBytes, 0, nread);
        }
        nread = 0;
        mdbytes = md.digest();  System.out.println(javax.xml.bind.DatatypeConverter.printHexBinary(mdbytes).toLowerCase());

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fis.close();
            dataBytes = null;
            md = null;
            mdbytes = null;
        } catch (IOException e) {
            e.printStackTrace();
      }       
    }
  }
}
4

3 に答える 3

1

他の人が言っているように、組み込みの Java MD5 コードを使用すると、メモリ フットプリントを非常に小さく保つことができるはずです。多数の Jar ファイル (それぞれ数 MB まで、通常は一度に 500 MB 相当) をハッシュするときに同様のことを行い、適切なパフォーマンスを得ます。システム構成に最適なサイズが見つかるまで、さまざまなバッファー サイズを試してみることをお勧めします。次のコード スニペットでは、一度に 1 バイトしか使用せず、md5 ハッシュの計算に使用される、、およびオブジェクトbufSize+128のオーバーヘッドは無視できます。FileMessageDigestInputStream

InputStream is = null;
File f = ...
int bufSize = ...
byte[] md5sum = null;

try {
    MessageDigest digest = MessageDigest.getInstance("MD5");
    is = new FileInputStream(f);
    byte[] buffer = new byte[bufSize];

    int read = 0;
    while((read = is.read(buffer)) > 0) digest.update(buffer,0,read);
    md5sum = digest.digest();
} catch (Exception e){
} finally {
    try{
        if(is != null) is.close();
    } catch (IOException e){}
}
于 2013-09-12T18:18:00.910 に答える