純粋なJava6で非常に大きなファイル用のSHA-1を作成する最良の方法は何ですか?このメソッドを実装する方法:
public abstract String createSha1(Java.io.File file);
MessageDigest
クラスを使用して、データを少しずつ提供します。以下の例では、byte []を文字列に変換したりファイルを閉じたりするなどの詳細は無視していますが、一般的な考え方はわかるはずです。
public byte[] createSha1(File file) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
InputStream fis = new FileInputStream(file);
int n = 0;
byte[] buffer = new byte[8192];
while (n != -1) {
n = fis.read(buffer);
if (n > 0) {
digest.update(buffer, 0, n);
}
}
return digest.digest();
}
Opは関数にSHA1の文字列を返すように要求したので、@ jeffsの回答を取り、不足している変換を文字列に追加しました。
/**
* Read the file and calculate the SHA-1 checksum
*
* @param file
* the file to read
* @return the hex representation of the SHA-1 using uppercase chars
* @throws FileNotFoundException
* if the file does not exist, is a directory rather than a
* regular file, or for some other reason cannot be opened for
* reading
* @throws IOException
* if an I/O error occurs
* @throws NoSuchAlgorithmException
* should never happen
*/
private static String calcSHA1(File file) throws FileNotFoundException,
IOException, NoSuchAlgorithmException {
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
try (InputStream input = new FileInputStream(file)) {
byte[] buffer = new byte[8192];
int len = input.read(buffer);
while (len != -1) {
sha1.update(buffer, 0, len);
len = input.read(buffer);
}
return new HexBinaryAdapter().marshal(sha1.digest());
}
}
public static String computeFileSHA1( File file ) throws IOException
{
String sha1 = null;
MessageDigest digest;
try
{
digest = MessageDigest.getInstance( "SHA-1" );
}
catch ( NoSuchAlgorithmException e1 )
{
throw new IOException( "Impossible to get SHA-1 digester", e1 );
}
try (InputStream input = new FileInputStream( file );
DigestInputStream digestStream = new DigestInputStream( input, digest ) )
{
while(digestStream.read() != -1){
// read file stream without buffer
}
MessageDigest msgDigest = digestStream.getMessageDigest();
sha1 = new HexBinaryAdapter().marshal( msgDigest.digest() );
}
return sha1;
}