The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.


Judy::HS - Efficiet string to integer map


Removing duplicates from a list using sugar

  use Judy::HS qw( Duplicates Free );

  my $judy;
  for (qw( d d c a d b c b a b a c )) {
    print "$_\n" if ! Duplicates( $judy, $_ );
  printf "Freed %d bytes\n", Free( $judy );

Remove duplicates with less sugar

  use Judy::HS qw( Set Get Free );

  my $judy;
  for (qw( d d c a d b c b a b a c )) {
      my ( undef, $value ) = Get( $judy, $_ );
      if ( ! $value ) {
          Set( $judy, $_, 1 );
          print "$_\n";
  printf "Freed %d bytes\n", Free( $judy );


Judy::HS is an equivalent to a hash of integers. The keys are all strings, the values are integers. JudyHS is a hybrid using the best capabilities of hashing and Judy methods. JudyHS does not have a poor performance case where knowledge of the hash algorithm can be used to degrade the performance.

Since JudyHS is based on a hash method, Keys are not stored in any particular order. Therefore the First(), Next(), Prev() and Last() neighbor search functions are not practical. To enumerate a Judy::HS object, see This is not supported but it works.

The hallmark of JudyHS is speed with scalability, but memory efficiency is excelleny. The speed is very competitive with the best hashing methods. The memory efficiency is similar to a linked list of the same Keys and Values. JudyHS is designed to scale from 0 to billions of Keys.

Nothing special is required to allocate a Judy::HS array. Just start using it.

    my $judy;
    if ( Get( $judy, 'omg' ) ) {
        Set( $judy, 'zomg', 42 );

As with an ordinary array, there are no duplicate keys in a Judy::HS array.


$Judy - Judy::HS array

$Key - a string with no null characters

$Value - integer

$PValue - pointer to integer


$PValue = Set( $Judy, $Key, $Value )

Insert/set a $Key and $Value into $Judy.

Returns $PValue pointing to the stored $Value. Your program can use this pointer to modify the stored $Value until the next Set(), Delete(), Free(). Example:

  use Judy::Mem qw( Peek );
  use Judy::HS qw( Set );

  $pvalue = Set( $judy, "al\0ha", 42 );
  printf "al\\0ha=%d\n", Peek( $pvalue );

Note: Set() and Delete can reorganize the JudyHS array. Therefore, pointers returned from previous JudyHS calls become invalid and must be re-acquired (using Get()).

bool = Delete( $Judy, $Key )

Delete the specified $Key/$Value pair from Judy::HS. Returns true if the element was removed, false otherwise.

( $PValue, $Value ) = Get( $Judy, $Key )

Get $Key's $Value. If $Key exists in $Judy, return $PValue pointing to $Key's $Value and $Value in a list. Return nothing if $Key isn't present.


There are no search functions and no endorsed methods for enumerating the contents of Judy::HS. It's possible though. See


bytes = Free( $Judy )

Frees an entire Judy::HS array. $Judy is set to 0.

bytes = MemUsed( $Judy )

Returns the size of a Judy::HS array. This implementation is not supplied by libJudy.


See Judy.


See Judy.


See Judy.