Android и Python разные контрольные суммы SHA1 одного и того же файла

Сценарий следующий:

Я хочу загрузить изображение на сервер. Но перед загрузкой файла я должен отправить контрольную сумму 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 контрольные суммы?


person nikmin    schedule 29.10.2013    source источник
comment
Как открыть файл на стороне сервера? Возможно, вам нужно открыть в двоичном режиме, чтобы избежать преобразования конца строки   -  person Ber    schedule 29.10.2013
comment
Я не пишу код на стороне сервера, но мне ответили, что это уже обработано :) Также у них нет проблем с созданием того же SHA1 из javascript.   -  person nikmin    schedule 29.10.2013


Ответы (1)


Оказалось, что перед созданием суммы sha1 было выполнено некоторое редактирование изображения на стороне сервера, что не должно было выполняться в этом сценарии. Они внесли изменения на стороне сервера, и теперь все работает отлично.

person nikmin    schedule 28.11.2013