package de.axone.equals;
import java.io.ByteArrayOutputStream;
public class Jenkins96HashCodeBuilder extends AbstractStrongHashCodeBuilder<Integer> {
private static final byte NULL_VALUE = 0;
private static final int EMPTY_VALUE = Integer.MAX_VALUE-1; // "Some" rare(?) value
public static final int EMPTY_HASH = (int)((new Jenkins96Backend()).hash( new byte[]{} ));
private Jenkins96Backend backend = new Jenkins96Backend();
//private final List<Byte> bytes = new ArrayList<Byte>();
//private final ByteBuffer bytes = new ByteBuffer();
private final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
private final boolean treatEmptyAsNull;
public Jenkins96HashCodeBuilder(){
this( true );
}
public Jenkins96HashCodeBuilder( boolean treatEmptyAsNull ){
this.treatEmptyAsNull = treatEmptyAsNull;
}
@Override
public StrongHashCodeBuilder<Integer> append( byte[] bytes ) {
if( bytes == null ) return appendNull();
if( bytes.length == 0 ) return appendEmpty();
for( byte b : bytes ){
this.bytes.write( b );
}
return this;
}
@Override
public StrongHashCodeBuilder<Integer> appendNull() {
return append( NULL_VALUE );
}
@Override
public StrongHashCodeBuilder<Integer> appendEmpty() {
if( treatEmptyAsNull ) return appendNull();
else return append( EMPTY_VALUE );
}
@Override
public StrongHashCodeBuilder<Integer> appendParent( Integer hash ) {
return append( hash );
}
@Override
public Integer combineHash( Integer hash1, Integer hash2 ) {
return hash1+hash2;
}
@Override
protected StrongHashCodeBuilder<Integer> builder() {
return new Jenkins96HashCodeBuilder( treatEmptyAsNull );
}
@Override
public Integer empty() {
return EMPTY_HASH;
}
@Override
public Integer toHashCode() {
byte[] bytes = this.bytes.toByteArray();
return (int)backend.hash( bytes );
}
}