/*
* @(#)Checksum.java 1.2 03/11/10
*
* Copyright 1996-2003 dcache.org All Rights Reserved.
*
* This software is the proprietary information of dCache.org
* Use is subject to license terms.
*/
package diskCacheV111.util;
import java.io.FileInputStream;
import java.security.MessageDigest;
import org.dcache.util.Checksum;
import static org.dcache.util.ByteUnit.KiB;
/**
*
* @author Patrick Fuhrmann
* @version 1.2, 03/11/10
* @see Preferences
* @since 1.4
*/
public class Adler32 extends MessageDigest
{
private static final int BASE = 65521 ; /* largest prime smaller than 65536 */
private final java.util.zip.Adler32 _zipAdler;
private long _adler = 1L ;
public Adler32(){
super("ADLER32") ;
_zipAdler = new java.util.zip.Adler32() ;
}
public void resetAdler32(){
_zipAdler.reset() ;
_adler = 1L ;
}
// public long updateAdler32(long adler, byte [] buf, int len){
// return updateAdler32( adler , buf , 0 , len ) ;
// }
public long updateAdler32(long adler, byte [] buf, int off , int len){
if( buf == null ) {
return 1L;
}
int s1 = (int) ( adler & 0xffffL );
int s2 = (int) ( ( adler >> 16) & 0xffffL );
for( int n = 0 ; n < len; n++ ){
s1 = (s1 + ( buf[off+n] & 0xFF ) ) % BASE;
s2 = (s2 + s1) % BASE;
}
return (s2 << 16) + s1;
}
public long getAdler32(){
return _adler ;
}
@Override
public byte [] engineDigest(){
// return digestAdler32() ;
return digestAdlerZip() ;
}
@Override
public void engineReset(){
// resetAdler32() ;
_zipAdler.reset() ;
}
@Override
public void engineUpdate( byte input ){
byte [] x = { input } ;
// _adler = updateAdler32( _adler , x , 0 , 1 ) ;
_zipAdler.update( x , 0 , 1 ) ;
}
@Override
public void engineUpdate( byte [] data , int offset , int size ){
// _adler = updateAdler32( _adler , data , offset , size ) ;
_zipAdler.update( data, offset , size ) ;
}
@Override
public int engineGetDigestLength(){ return 4 ; }
public byte [] digestAdler32(){
byte [] _value = new byte[4] ;
_value[0] = (byte) ((_adler>>24)&0xff) ;
_value[1] = (byte) ((_adler>>16)&0xff) ;
_value[2] = (byte) ((_adler>>8)&0xff) ;
_value[3] = (byte) ((_adler)&0xff) ;
return _value ;
}
public byte [] digestAdlerZip(){
_adler = _zipAdler.getValue() ;
byte [] _value = new byte[4] ;
_value[0] = (byte) ((_adler>>24)&0xff) ;
_value[1] = (byte) ((_adler>>16)&0xff) ;
_value[2] = (byte) ((_adler>>8)&0xff) ;
_value[3] = (byte) ((_adler)&0xff) ;
return _value ;
}
public static void main( String [] args )throws Exception {
if( args.length < 1 ){
System.err.println("Usage : ... <filename>") ;
System.exit(4);
}
MessageDigest adler = new Adler32() ;
FileInputStream in = new FileInputStream( args[0] ) ;
byte [] buffer = new byte[KiB.toBytes(1)] ;
long sum = 0L ;
long started = System.currentTimeMillis() ;
while(true){
int rc = in.read( buffer , 0 , buffer.length ) ;
if( rc <=0 ) {
break;
}
sum += rc ;
adler.update( buffer , 0 , rc ) ;
}
started = System.currentTimeMillis() - started ;
in.close() ;
byte [] digest = adler.digest() ;
System.out.println("Adler : ("+sum+") "+Checksum.bytesToHexString(digest) ) ;
System.out.println("Done in "+started+" milli seconds" ) ;
System.exit(0);
}
}