シナリオは次のとおりです。
サーバーに画像をアップロードしたい。ただし、ファイルをアップロードする前に、SHA1
そのファイルのチェックサムを送信する必要があるため、サーバーはファイルが既にアップロードされているかどうかを確認できるため、再度アップロードする必要はありません。
SHA1
問題は、同じファイルに対して、アプリとサーバー側で同じチェックサムが得られないことです。
私のAndroidアプリのコードは次のとおりです。
public static String getSHA1FromFileContent(String filename)
throws NoSuchAlgorithmException, IOException {
final MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
InputStream is = new BufferedInputStream(new FileInputStream(filename));
final byte[] buffer = new byte[1024];
for (int read = 0; (read = is.read(buffer)) != -1;) {
messageDigest.update(buffer, 0, read);
}
is.close();
// Convert the byte to hex format
Formatter formatter = new Formatter();
for (final byte b : messageDigest.digest()) {
formatter.format("%02x", b);
}
String res = formatter.toString();
formatter.close();
return res;
}
サーバー側のコードは次のとおりです。
def hashFile(f):
sha1 = hashlib.sha1()
if hasattr(f, 'multiple_chunks') and f.multiple_chunks():
for c in f.chunks():
sha1.update(c)
else:
try:
sha1.update(f.read())
finally:
f.close()
return sha1.hexdigest()
何が問題で、異なるチェックサムを取得するのはなぜSHA1
ですか?