Class ByteQuadsCanonicalizer

java.lang.Object
com.fasterxml.jackson.core.sym.ByteQuadsCanonicalizer

public final class ByteQuadsCanonicalizer extends Object
Replacement for BytesToNameCanonicalizer which aims at more localized memory access due to flattening of name quad data. Performance improvement modest for simple JSON document data binding (maybe 3%), but should help more for larger symbol tables, or for binary formats like Smile.

Hash area is divided into 4 sections:

  1. Primary area (1/2 of total size), direct match from hash (LSB)
  2. Secondary area (1/4 of total size), match from hash (LSB) >> 1
  3. Tertiary area (1/8 of total size), match from hash (LSB) >> 2
  4. Spill-over area (remaining 1/8) with linear scan, insertion order
and within every area, entries are 4 ints, where 1 - 3 ints contain 1 - 12 UTF-8 encoded bytes of name (null-padded), and last int is offset in _names that contains actual name Strings.
Since:
2.6
  • Method Details

    • createRoot

      public static ByteQuadsCanonicalizer createRoot()
      Factory method to call to create a symbol table instance with a randomized seed value.
      Returns:
      Root instance to use for constructing new child instances
    • makeChild

      public ByteQuadsCanonicalizer makeChild(int flags)
      Factory method used to create actual symbol table instance to use for parsing.
      Parameters:
      flags - Bit flags of active JsonFactory.Features enabled.
      Returns:
      Actual canonicalizer instance that can be used by a parser
    • makeChildOrPlaceholder

      public ByteQuadsCanonicalizer makeChildOrPlaceholder(int flags)
      Method similar to makeChild(int) but one that only creates real instance of JsonFactory.Feature.CANONICALIZE_FIELD_NAMES is enabled: otherwise a "bogus" instance is created.
      Parameters:
      flags - Bit flags of active JsonFactory.Features enabled.
      Returns:
      Actual canonicalizer instance that can be used by a parser if (and only if) canonicalization is enabled; otherwise a non-null "placeholder" instance.
      Since:
      2.13
    • release

      public void release()
      Method called by the using code to indicate it is done with this instance. This lets instance merge accumulated changes into parent (if need be), safely and efficiently, and without calling code having to know about parent information.
    • size

      public int size()
      Returns:
      Number of symbol entries contained by this canonicalizer instance
    • bucketCount

      public int bucketCount()
      Returns:
      number of primary slots table has currently
    • maybeDirty

      public boolean maybeDirty()
      Method called to check to quickly see if a child symbol table may have gotten additional entries. Used for checking to see if a child table should be merged into shared table.
      Returns:
      Whether main hash area has been modified
    • hashSeed

      public int hashSeed()
    • isCanonicalizing

      public boolean isCanonicalizing()
      Returns:
      True for "real", canonicalizing child tables; false for root table as well as placeholder "child" tables.
      Since:
      2.13
    • primaryCount

      public int primaryCount()
      Method mostly needed by unit tests; calculates number of entries that are in the primary slot set. These are "perfect" entries, accessible with a single lookup
      Returns:
      Number of entries in the primary hash area
    • secondaryCount

      public int secondaryCount()
      Method mostly needed by unit tests; calculates number of entries in secondary buckets
      Returns:
      Number of entries in the secondary hash area
    • tertiaryCount

      public int tertiaryCount()
      Method mostly needed by unit tests; calculates number of entries in tertiary buckets
      Returns:
      Number of entries in the tertiary hash area
    • spilloverCount

      public int spilloverCount()
      Method mostly needed by unit tests; calculates number of entries in shared spill-over area
      Returns:
      Number of entries in the linear spill-over areay
    • totalCount

      public int totalCount()
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • findName

      public String findName(int q1)
    • findName

      public String findName(int q1, int q2)
    • findName

      public String findName(int q1, int q2, int q3)
    • findName

      public String findName(int[] q, int qlen)
    • addName

      public String addName(String name, int q1) throws StreamConstraintsException
      Parameters:
      name - Name to add
      q1 - Quad representation of the name
      Returns:
      name (possibly interned)
      Throws:
      StreamConstraintsException - if the constraint exceptions
    • addName

      public String addName(String name, int q1, int q2) throws StreamConstraintsException
      Parameters:
      name - Name to add
      q1 - First quad of name representation
      q2 - Second quad of name representation
      Returns:
      name (possibly interned)
      Throws:
      StreamConstraintsException - if the constraint exceptions
    • addName

      public String addName(String name, int q1, int q2, int q3) throws StreamConstraintsException
      Parameters:
      name - Name to add
      q1 - First quad of name representation
      q2 - Second quad of name representation
      q3 - Third quad of name representation
      Returns:
      name (possibly interned)
      Throws:
      StreamConstraintsException - if the constraint exceptions
    • addName

      public String addName(String name, int[] q, int qlen) throws StreamConstraintsException
      Parameters:
      name - Name to add
      q - Quads of name representation
      qlen - Number of quads in q
      Returns:
      name (possibly interned)
      Throws:
      StreamConstraintsException - if the constraint exceptions
    • calcHash

      public int calcHash(int q1)
    • calcHash

      public int calcHash(int q1, int q2)
    • calcHash

      public int calcHash(int q1, int q2, int q3)
    • calcHash

      public int calcHash(int[] q, int qlen)
      Parameters:
      q - int array
      qlen - length
      Returns:
      hash
      Throws:
      IllegalArgumentException - if qlen is less than 4