From WikiChip
mirc/commands/hmake
< mirc‎ | commands
Revision as of 23:05, 2 December 2013 by David (talk | contribs) (Created page with "The '''/hmake command''' can be used to create a new hash table by a specific handle name. A hash table is stored entirely in memory and thus it is the programmer's responsib...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

The /hmake command can be used to create a new hash table by a specific handle name.

A hash table is stored entirely in memory and thus it is the programmer's responsibility to save the data to a file if necessary via the /hsave command (and load it back later via the /hload command).

The number of buckets is always made to be a prime number before the hash table is created. If [num_buckets] is an even number, mIRC will add one to the number. The range of buckets is between 1 and 10000, making the final capacity between 1 and 10001. A hash table name is limited to 256 significant characters - any additional characters are simply ignored. In mIRC, a hash table is a much faster alternative to ini and normal text files.

Note: For most practical purposes, it's best to keep the ratio of <item count>:<maximum capacity> at 78% to maintain a good time-space tradeoff (i.e. 0.78 load factor). That means if you are planning on storing 78 items in the hash table, you should create a hash table with the size of 100 buckets. (A table of 1000 buckets is good to store up to about 780 items to maintain a maximum performance). The general equation to calculate optimal number of buckets is:

[#_of_buckets] = [#_of_keys_that_will_be_used] / 0.78

Linked List

Because the hash table uses chaining to resolve collisions and due to the fact mIRC does not rehash or grows the array, using a hash table with 1 bucket, the hmake command can be used to create a linked list. New items are added to the start of the chain (i.e. $hget(<table_name>, 1) will always be last item added). Additionally, changing the value or removing an item does not alter the overall order of the list.

Synopsis

/hmake [-s] <table_name> [num_buckets]

Switches

  • -s - displays a successful creation

Parameters

  • <table_name> - The name of the table you wish to make.
  • [num_buckets] - The number of buckets to use as the table's capacity (If no number is specified, the default is 100)

Example

A basic usage for a hash table.

; call the setup once
; /abbr_setup
;
; //echo -a $abbr(lol)
;
alias abbr_setup {
  ;create the table
  hmake abbr 1000
 
  ; populate the table
  hadd abbr lol laughing out load
  hadd abbr omg oh my gosh
  hadd abbr lmao laughing my a?? off
  hadd abbr brb be right back
 
  ; ...
}
; get the abbreviation
alias abbr return $hget(abbr, $1)

Because a hash table of 1 buck is the same as a linked list, we can easily implement an almost-native stack data structure.

;/stack_example
; Output:
;   poped: DDD
;   poped: CCC
;   poped: BBB
;   poped: AAA
alias stack_example {
  ; create a linked-list
  hmake stack 1
 
  ; push items
  push stack AAA
  push stack BBB
  push stack CCC
  push stack DDD
 
  ; pop everything
  while ($pop(stack)) {
    echo -a poped: $v1
  }
 
  ; delete linked-list
  hfree stack
}
alias push {
  ; keep a counter so we keep a unique key each time
  if (!$hget($1,0).item) hadd $1 counter 1
  else hadd $1 counter $calc($hget($1, counter).data + 1)
 
  ; make it the first item
  hadd $1 key. $+ $hget($1, counter).data $2
}
alias pop {
  if ($hget($1, 1).item != counter && $hget($1, 1).data) {
    ; delete the item
    hdel $1 $hget($1, 1).item
    ; return value
    return $v1
  }
}

Compatibility

Added: mIRC v5.8

Added On: 05/09/2000

Note: Individual switches were not taken into consideration.

See also