TubeLab-App-Android/frostwire-jlibtorrent/src/main/java/com/frostwire/jlibtorrent/Sha1Hash.java

175 lines
3.7 KiB
Java

package com.frostwire.jlibtorrent;
import com.frostwire.jlibtorrent.swig.sha1_hash;
import com.frostwire.jlibtorrent.swig.sha1_hash_vector;
import java.util.ArrayList;
/**
* This type holds a SHA-1 digest or any other kind of 20 byte
* sequence. It implements a number of convenience functions, such
* as bit operations, comparison operators etc.
* <p>
* In libtorrent it is primarily used to hold info-hashes, piece-hashes,
* peer IDs, node IDs etc.
*
* @author gubatron
* @author aldenml
*/
public final class Sha1Hash implements Comparable<Sha1Hash>, Cloneable {
private final sha1_hash h;
/**
* @param h native object
*/
public Sha1Hash(sha1_hash h) {
this.h = h;
}
/**
* @param bytes hash as an array of bytes
*/
public Sha1Hash(byte[] bytes) {
if (bytes.length != 20) {
throw new IllegalArgumentException("bytes array must be of length 20");
}
this.h = new sha1_hash(Vectors.bytes2byte_vector(bytes));
}
/**
* @param hex hex coded representation of the hash
*/
public Sha1Hash(String hex) {
this(Hex.decode(hex));
}
/**
* Constructs an all-zero sha1-hash
*/
public Sha1Hash() {
this(new sha1_hash());
}
/**
* @return the native object
*/
public sha1_hash swig() {
return h;
}
/**
* set the sha1-hash to all zeroes.
*/
public void clear() {
h.clear();
}
/**
* return true if the sha1-hash is all zero.
*
* @return true if zero
*/
public boolean isAllZeros() {
return h.is_all_zeros();
}
/**
* @return the number of leading zeroes
*/
public int countLeadingZeroes() {
return h.count_leading_zeroes();
}
/**
* Returns the hex representation of this has.
* <p>
* This method uses internally the libtorrent to_hex function.
*
* @return the hex representation
*/
public String toHex() {
return h.to_hex();
}
/**
* @param o {@inheritDoc}
* @return {@inheritDoc}
*/
@Override
public int compareTo(Sha1Hash o) {
return sha1_hash.compare(this.h, o.h);
}
/**
* Returns an hex representation of this hash. Internally it
* calls {@link #toHex()}.
*
* @return {@inheritDoc}
*/
@Override
public String toString() {
return toHex();
}
/**
* @param obj {@inheritDoc}
* @return {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Sha1Hash)) {
return false;
}
return h.op_eq(((Sha1Hash) obj).h);
}
/**
* @return {@inheritDoc}
*/
@Override
public int hashCode() {
return h.hash_code();
}
@Override
public Sha1Hash clone() {
return new Sha1Hash(new sha1_hash(h));
}
/**
* returns an all-F sha1-hash. i.e. the maximum value
* representable by a 160 bit number (20 bytes). This is
* a static member function.
*
* @return the maximum number
*/
public static Sha1Hash max() {
return new Sha1Hash(sha1_hash.max());
}
/**
* returns an all-zero sha1-hash. i.e. the minimum value
* representable by a 160 bit number (20 bytes). This is
* a static member function.
*
* @return the minimum number (zero)
*/
public static Sha1Hash min() {
return new Sha1Hash(sha1_hash.min());
}
static ArrayList<Sha1Hash> convert(sha1_hash_vector v) {
int size = (int) v.size();
ArrayList<Sha1Hash> l = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
l.add(new Sha1Hash(v.get(i)));
}
return l;
}
}