Class Hash

All Implemented Interfaces:
IValidated, IWriteable, Comparable<ABlob>

public class Hash extends AArrayBlob
Class used to represent an immutable 32-byte Hash value. The Hash algorithm used may depend on context. This is intended to help with type safety vs. regular Blob objects and as a useful type as a key in relevant data structures. "Companies spend millions of dollars on firewalls, encryption and secure access devices, and it's money wasted, because none of these measures address the weakest link in the security chain." - Kevin Mitnick
  • Field Details

    • LENGTH

      public static final int LENGTH
      Standard length of a Hash in bytes
      See Also:
      Constant Field Values
    • TYPE

      public static final AType TYPE
      Type of Hash values
    • NULL_HASH

      public static final Hash NULL_HASH
    • TRUE_HASH

      public static final Hash TRUE_HASH
    • FALSE_HASH

      public static final Hash FALSE_HASH
    • EMPTY_HASH

      public static final Hash EMPTY_HASH
  • Method Details

    • wrap

      public static Hash wrap(byte[] hashBytes)
      Wraps the specified bytes as a Data object Warning: underlying bytes are used directly. Use only if no external references to the byte array will be retained.
      Parameters:
      hashBytes - Bytes to wrap
      Returns:
      Hash wrapping the given byte array
    • wrap

      public static Hash wrap(AArrayBlob data)
      Wraps the specified blob data as a Hash, sharing the underlying byte array.
      Parameters:
      data - Blob data of correct size for a Hash. Must have at least enough bytes for a Hash
      Returns:
      Wrapped data as a Hash
    • wrap

      public static Hash wrap(byte[] hashBytes, int offset)
      Wraps the specified bytes as a Data object Warning: underlying bytes are used directly. Use only if no external references to the byte array will be retained.
      Parameters:
      hashBytes - Byte array containing hash value
      offset - Offset into byte array for start of hash value
      Returns:
      Hash wrapping the given byte array segment
    • equals

      public boolean equals(ABlob other)
      Description copied from class: ABlob
      Determines if this Blob is equal to another Blob. Blobs are defined to be equal if they have the same on-chain representation, i.e. if and only if all of the following are true: - Blob is of the same general type - Blobs are of the same length - All byte values are equal
      Specified by:
      equals in class ABlob
      Parameters:
      other - Blob to compare with
      Returns:
      true if Blobs are equal, false otherwise
    • equals

      public boolean equals(Hash other)
      Tests if the Hash value is precisely equal to another non-null Hash value.
      Parameters:
      other - Hash to comapre with
      Returns:
      true if Hashes are equal, false otherwise.
    • firstInt

      public int firstInt()
      Get the first 32 bits of this Hash. Used for Java hashCodes
      Returns:
      Int representing the first 32 bits
    • fromHex

      public static Hash fromHex(String hexString)
      Constructs a Hash object from a hex string
      Parameters:
      hexString - Hex String
      Returns:
      Hash with the given hex string value, or null is String is not valid
    • wrap

      public static Hash wrap(AArrayBlob data, int offset, int length)
    • compute

      public static Hash compute(ACell value)
      Computes the Hash for any ACell value. May return a cached Hash if available in memory.
      Parameters:
      value - Any Cell
      Returns:
      Hash of the encoded data for the given value
    • readRaw

      public static Hash readRaw(ByteBuffer bb)
      Reads a Hash from a ByteBuffer Assumes no Tag, i.e. just Hash.LENGTH for the hash is read.
      Parameters:
      bb - ByteBuffer to read from
      Returns:
      Hash object read from ByteBuffer
    • encode

      public int encode(byte[] bs, int pos)
      Description copied from class: ACell
      Writes this Cell's encoding to a byte array, including a tag byte which will be written first
      Specified by:
      encode in interface IWriteable
      Specified by:
      encode in class ACell
      Parameters:
      bs - A byte array to which to write the encoding
      pos - The offset into the byte array
      Returns:
      New position after writing
    • isCanonical

      public boolean isCanonical()
      Description copied from class: ACell
      Returns true if this Cell is in a canonical format for message writing. Reading or writing a non-canonical value should be considered illegal, but non-canonical objects may be used on a temporary internal basis.
      Specified by:
      isCanonical in class ACell
      Returns:
      true if the object is in canonical format, false otherwise
    • isCVMValue

      public final boolean isCVMValue()
      Description copied from class: ACell
      Returns true if this object represents a first class CVM Value. Sub-structural cells that are not themselves first class values should return false. CVM values might not be in a canonical format, e.g. temporary data structures
      Specified by:
      isCVMValue in class ACell
      Returns:
      true if the object is a CVM Value, false otherwise
    • estimatedEncodingSize

      public int estimatedEncodingSize()
      Description copied from interface: IWriteable
      Estimate the encoded data size for this Cell. Used for quickly sizing buffers. Implementations should try to return a size that is likely to contain the entire object when represented in binary format, including the tag byte.
      Returns:
      The estimated size for the binary representation of this object.
    • getEncodingLength

      public long getEncodingLength()
      Description copied from class: ACell
      Method to calculate the encoding length of a Cell. May be overridden to avoid creating encodings during memory size calculations. This reduces hashing!
      Overrides:
      getEncodingLength in class ACell
      Returns:
      Exact encoding length of this Cell
    • getChunk

      public Blob getChunk(long i)
      Description copied from class: ABlob
      Gets a chunk of this Blob, as a canonical Blob up to the maximum chunk size
      Specified by:
      getChunk in class ABlob
      Parameters:
      i - Index of chunk
      Returns:
      A Blob containing the specified chunk data.
    • validateCell

      public void validateCell() throws InvalidDataException
      Description copied from class: ACell
      Validates the local structure and invariants of this cell. Called by validate() super implementation. Should validate directly contained data, but should not validate all other structure of this cell. In particular, should not traverse potentially missing child Refs.
      Overrides:
      validateCell in class AArrayBlob
      Throws:
      InvalidDataException - If the Cell is invalid
    • isEmbedded

      public boolean isEmbedded()
      Description copied from class: ACell
      Determines if this Cell Represents an embedded object. Embedded objects are encoded directly into the encoding of the containing Cell (avoiding the need for a hashed reference). Subclasses should override this if they have a cheap O(1) way to determine if they are embedded or otherwise.
      Overrides:
      isEmbedded in class ACell
      Returns:
      true if Cell is embedded, false otherwise
    • isRegularBlob

      public boolean isRegularBlob()
      Description copied from class: ABlob
      Returns true if this object is a regular blob (i.e. not a special blob type like Hash or Address)
      Overrides:
      isRegularBlob in class ABlob
      Returns:
      True if a regular blob
    • getTag

      public byte getTag()
      Description copied from class: ACell
      Gets the tag byte for this cell. The tag byte is always written as the first byte of the Cell's Encoding
      Specified by:
      getTag in class ACell
      Returns:
      Tag byte for this Cell
    • toCanonical

      public Blob toCanonical()
      Description copied from class: ACell
      Converts this Cell to its canonical version. Returns this if already canonical
      Specified by:
      toCanonical in class ABlob
      Returns:
      Canonical version of Cell