2013-10-29 199 views
0

該場景是下一個:Android和Python不同的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校驗?

+0

如何打開服務器端的文件?可能你需要以二進制模式打開,以避免線端轉換 – Ber

+0

我不寫服務器端代碼,但我得到的答案是,這已經處理:)另外,他們沒有問題,從JavaScript生成相同的SHA1 – nikmin

回答

0

原來在生成sha1總和之前有一些服務器端圖像編輯,這並不意味着在這種情況下完成。他們在服務器端進行了更改,現在這一切都很完美。