package org.torrent.internal.data;
import java.util.Arrays;
import org.torrent.internal.util.Validator;
public final class Hash {
private static final String HEX = "0123456789ABCDEF";
private final byte[] hash;
private final Type type;
public enum Type {
ID(-1),
SHA1(20);
private final int length;
Type(int length) {
this.length = length;
}
}
public Hash(byte[] hash, Type type) {
Validator.nonNull(hash, type);
Validator.isTrue(type.length < 0 || type.length == hash.length, "Invalid hash size for " + type);
this.hash = Arrays.copyOf(hash, hash.length);
this.type = type;
}
@Override
public int hashCode() {
return Arrays.hashCode(hash) ^ type.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != Hash.class) {
return false;
}
Hash other = (Hash) obj;
return other.type == type && Arrays.equals(hash, other.hash);
}
public String asHexString() {
StringBuilder b = new StringBuilder(hash.length * 2);
for (int i = 0; i < hash.length; i++) {
b.append(HEX.charAt((hash[i] & 0xff) >> 4));
b.append(HEX.charAt(hash[i] & 15));
}
return b.toString();
}
@Override
public String toString() {
return "HASH, type " + type + " with value " + asHexString();
}
public byte[] toByteArray() {
return Arrays.copyOf(hash, hash.length);
}
public int getHashLength() {
return hash.length;
}
public Type getType() {
return type;
}
}