【发布时间】:2014-12-17 05:19:50
【问题描述】:
理论上,我了解生成 S3 分段上传 eTag 的算法。但是,我没有得到预期的结果。有人可以帮忙吗?
多部分上传的 eTag 理论(至少我的理解):
获取每个上传部分的 md5 并将它们连接起来。然后,取串联的 md5 的 md5。最后加上一个“-”和上传的部分数。
注意:下面的示例使用了组合的 md5 值。生成的 md5 不是 md5 部分的实际 md5
例如
- 283771245d05b26c35768d1f182fbac0 - 文件第 1 部分的 md5
- 673c3f1ad03d60ea0f64315095ad7131 - 文件第 2 部分的 md5
- 11c68be603cbe39357a0f93be6ab9e2c - 文件第 3 部分的 md5
串联 md5: 283771245d05b26c35768d1f182fbac0673c3f1ad03d60ea0f64315095ad713111c68be603cbe39357a0f93be6ab9e2c
上面连接字符串的 md5 与破折号和文件部分的数量:
115671880ddffe8860d6aabd09139708-3
要在 Java 中执行此操作,我尝试了两种方法 - 都没有返回正确的 eTag 值
int MB = 1048576;
int bufferSize = 5 * MB;
byte[] buffer = new byte[ bufferSize ];
try { // String method
FileInputStream fis = new FileInputStream( new File( fileName ) );
int bytesRead;
String md5s = "";
do {
bytesRead = fis.read( buffer );
String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex( new String( buffer ) );
md5s += md5;
} while ( bytesRead == bufferSize );
System.out.println( org.apache.commons.codec.digest.DigestUtils.md5Hex( md5s ) );
fis.close();
}
catch( Exception e ) {
System.out.println( e );
}
try { // Byte array method
FileInputStream fis = new FileInputStream( new File( fileName ) );
int bytesRead;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
do {
bytesRead = fis.read( buffer );
byteArrayOutputStream.write( org.apache.commons.codec.digest.DigestUtils.md5( buffer ) );
} while ( bytesRead == bufferSize );
System.out.println( org.apache.commons.codec.digest.DigestUtils.md5Hex( byteArrayOutputStream.toByteArray() ) );
fis.close();
}
catch( Exception e ) {
System.out.println( e );
}
谁能发现为什么这两种算法都不起作用?
【问题讨论】:
标签: java algorithm amazon-web-services hash amazon-s3