/hmake
Indice
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
[#_of_buckets] = [#_of_keys_that_will_be_used] / 0.78
| Contents - 1 Linked List - 2 Synopsis - 3 Switches - 4 Parameters - 5 Example - 6 Compatibility - 7 See also |
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: 09/05/2000
Note: Individual switches were not taken into consideration.
See also
mIRC commands list