Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.qiniu.android.utils;
  
  
  import java.io.File;
计算文件内容或者二进制数据的etag, etag算法是七牛用来标志数据唯一性的算法。 文档:etag算法
 
 public final class Etag {

    
计算二进制数据的etag

Parameters:
data 二进制数据
offset 起始字节索引
length 需要计算的字节长度
Returns:
二进制数据的etag
 
     public static String data(byte[] dataint offsetint length) {
         try {
             return stream(new ByteArrayInputStream(dataoffsetlength), length);
         } catch (IOException e) {
             e.printStackTrace();
         }
         // never reach
         return null;
     }

    
计算二进制数据的etag

Parameters:
data 二进制数据
Returns:
二进制数据的etag
 
     public static String data(byte[] data) {
         return data(data, 0, data.length);
     }

    
计算文件内容的etag

Parameters:
file 文件对象
Returns:
文件内容的etag
Throws:
java.io.IOException 文件读取异常
 
     public static String file(File filethrows IOException {
         FileInputStream fi = new FileInputStream(file);
         return stream(fifile.length());
     }

    
计算文件内容的etag

Parameters:
filePath 文件路径
Returns:
文件内容的etag
Throws:
java.io.IOException 文件读取异常
 
     public static String file(String filePaththrows IOException {
         File f = new File(filePath);
         return file(f);
     }

    
计算输入流的etag

Parameters:
in 数据输入流
len 数据流长度
Returns:
数据流的etag值
Throws:
java.io.IOException 文件读取异常
 
     public static String stream(InputStream inlong lenthrows IOException {
         if (len == 0) {
             return "Fto5o-5ea0sNMlW_75VgGJCv2AcJ";
         }
         byte[] buffer = new byte[64 * 1024];
         byte[][] blocks = new byte[(int) (len + . - 1) / .][];
         for (int i = 0; i < blocks.lengthi++) {
             long left = len - (long. * i;
             long read = left > . ? . : left;
             blocks[i] = oneBlock(bufferin, (intread);
         }
         return resultEncode(blocks);
     }

    
单块计算hash

Parameters:
buffer 数据缓冲区
in 输入数据
len 输入数据长度
Returns:
计算结果
Throws:
java.io.IOException 读取出错
    private static byte[] oneBlock(byte[] bufferInputStream inint lenthrows IOException {
        MessageDigest sha1 = null;
        try {
            sha1 = MessageDigest.getInstance("sha-1");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            //never reach
            return null;
        }
        int buffSize = buffer.length;
        while (len != 0) {
            int next = buffSize > len ? len : buffSize;
            //noinspection ResultOfMethodCallIgnored
            in.read(buffer, 0, next);
            sha1.update(buffer, 0, next);
            len -= next;
        }
        return sha1.digest();
    }

    
合并结果

Parameters:
sha1s 每块计算结果的列表
Returns:
最终的结果
    private static String resultEncode(byte[][] sha1s) {
        byte head = 0x16;
        byte[] finalHash = sha1s[0];
        int len = finalHash.length;
        byte[] ret = new byte[len + 1];
        if (sha1s.length != 1) {
            head = (byte) 0x96;
            MessageDigest sha1 = null;
            try {
                sha1 = MessageDigest.getInstance("sha-1");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                // never reach
                return null;
            }
            for (byte[] s : sha1s) {
                sha1.update(s);
            }
            finalHash = sha1.digest();
        }
        ret[0] = head;
        System.arraycopy(finalHash, 0, ret, 1, len);
        return UrlSafeBase64.encodeToString(ret);
    }
New to GrepCode? Check out our FAQ X