目录

算法介绍

sha256生成文件签名JAVA实现:

private static final char[] HEX_DIGITS ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

/**
 * 计算sha256
 *
 * @param bytes 二进制数组
 * @return String
 */
public static String digest(byte[] bytes) throws NoSuchAlgorithmException {
    MessageDigest messagedigest = MessageDigest.getInstance("SHA-256");
    messagedigest.update(bytes);
    return bufferToHex(messagedigest.digest());
}

/**
 * 计算二进制数据
 *
 * @param bytes 二进制数组
 * @return String
 */
private static String bufferToHex(byte[] bytes) {
    return bufferToHex(bytes, 0, bytes.length);
}

/**
 * 计算二进制数据
 *
 * @param bytes 二进制数组
 * @param m 长度1
 * @param n 长度2
 * @return hex值
 */
private static String bufferToHex(byte[] bytes, int m, int n) {
    StringBuffer stringBuffer = new StringBuffer(2 * n);
    int k = m + n;
    for (int l = m; l < k; l++) {
        appendHexPair(bytes[l], stringBuffer);
    }
    return stringBuffer.toString();
}

/**
 * 字符缓冲处理
 *
 * @param bt 字符
 * @param stringBuffer 字符串缓冲区
 */
private static void appendHexPair(byte bt, StringBuffer stringBuffer) {
    char c0 = HEX_DIGITS[(bt & 0xf0) >> 4];
    char c1 = HEX_DIGITS[bt & 0xf];
    stringBuffer.append(c0);
    stringBuffer.append(c1);
}

sha256生成文件签名Python实现:

import sys
import hashlib

def sha256file(fpath, batch_size):
  with open(fpath, 'rb') as f:
    hash = hashlib.sha256()
    offset = 0
    for chunk in iter(lambda: f.read(batch_size), b''):
      if chunk != '':
        chunk_digest=sha256chunk(chunk)
        print 'offset:', offset, 'sha256:', chunk_digest
        offset += len(chunk)
      hash.update(chunk)
    return hash.hexdigest()

def sha256chunk(buf):
  hash = hashlib.sha256()
  hash.update(buf)
  return hash.hexdigest()

if __name__ == '__main__':
  if len(sys.argv) >= 2:
    digest = sha256file(sys.argv[1], 10*1024*1024)
    print 'file sha256:', digest