package com.ripple.core.coretypes.hash; import com.ripple.core.coretypes.hash.prefixes.HashPrefix; import com.ripple.core.coretypes.hash.prefixes.Prefix; import com.ripple.core.fields.Field; import com.ripple.core.fields.Hash256Field; import com.ripple.core.fields.Type; import com.ripple.core.serialized.BytesSink; import java.math.BigInteger; import java.util.TreeMap; public class Hash256 extends Hash<Hash256> { public static final BigInteger bookBaseSize = new BigInteger("10000000000000000", 16); public static class Hash256Map<Value> extends TreeMap<Hash256, Value> { public Hash256Map(Hash256Map<Value> cache) { super(cache); } public Hash256Map() { } } public static final Hash256 ZERO_256 = new Hash256(new byte[32]); @Override public Object toJSON() { return translate.toJSON(this); } @Override public byte[] toBytes() { return translate.toBytes(this); } @Override public String toHex() { return translate.toHex(this); } @Override public void toBytesSink(BytesSink to) { translate.toBytesSink(this, to); } @Override public Type type() { return Type.Hash256; } public boolean isZero() { return equals(Hash256.ZERO_256); } public boolean isNonZero() { return !isZero(); } public static Hash256 fromHex(String s) { return translate.fromHex(s); } public Hash256(byte[] bytes) { super(bytes, 32); } public static Hash256 signingHash(byte[] blob) { return prefixedHalfSha512(HashPrefix.txSign, blob); } public static Hash256 prefixedHalfSha512(Prefix prefix, byte[] blob) { HalfSha512 messageDigest = HalfSha512.prefixed256(prefix); messageDigest.update(blob); return messageDigest.finish(); } public int nibblet(int depth) { int byte_ix = depth > 0 ? depth / 2 : 0; int b = super.hash[byte_ix]; if (depth % 2 == 0) { b = (b & 0xF0) >> 4; } else { b = b & 0x0F; } return b; } public static class Translator extends HashTranslator<Hash256> { @Override public Hash256 newInstance(byte[] b) { return new Hash256(b); } @Override public int byteWidth() { return 32; } } public static Translator translate = new Translator(); public static Hash256Field hash256Field(final Field f) { return new Hash256Field(){ @Override public Field getField() {return f;}}; } static public Hash256Field LedgerHash = hash256Field(Field.LedgerHash); static public Hash256Field ParentHash = hash256Field(Field.ParentHash); static public Hash256Field TransactionHash = hash256Field(Field.TransactionHash); static public Hash256Field AccountHash = hash256Field(Field.AccountHash); static public Hash256Field PreviousTxnID = hash256Field(Field.PreviousTxnID); static public Hash256Field AccountTxnID = hash256Field(Field.AccountTxnID); static public Hash256Field LedgerIndex = hash256Field(Field.LedgerIndex); static public Hash256Field WalletLocator = hash256Field(Field.WalletLocator); static public Hash256Field RootIndex = hash256Field(Field.RootIndex); static public Hash256Field BookDirectory = hash256Field(Field.BookDirectory); static public Hash256Field InvoiceID = hash256Field(Field.InvoiceID); static public Hash256Field Nickname = hash256Field(Field.Nickname); static public Hash256Field Amendment = hash256Field(Field.Amendment); static public Hash256Field TicketID = hash256Field(Field.TicketID); static public Hash256Field hash = hash256Field(Field.hash); static public Hash256Field index = hash256Field(Field.index); }