the two things are totally different,
A hash table is esentially an array, but instead of a dimension from 0 to n or even 0 to infinite, it uses symbols to identify each array element, I also dont think they remain in the order u make em (not sure on that)
ie:
/hadd tablename 1 fred was here
/hadd tablename 2 bill left today
/hadd tablename G jill is missing
^ thats 3 array entries tablename(1), tablename(2), and tablename(G) [as you can see you dont have to use just numbers]

now tokens are something differnet, and i think your only seeing them from the simplest of views such as
var %tablename fred was here ! bill left today ! jill is missing
$gettok(%tablename,1,33)
$gettok(%tablename,2,$asc(!)) < 33 is of course ! and thats the seperator I used here)
$gettok(%tablename,1,33)

heres what you might uses tokens for
[ $1 = <- :Motorolan!~me@53886e8.10eff834.1377149a.36cd2766.IP PRIVMSG #blah :i am here ]
echo $gettok($gettok($1,1,$asc(!)),2,$asc(:)) just did a $gettok($1,3,32)

your result would be
Motorolan just did a PRIVMSG #blah :i am here

breaking it down $gettok($1,1,$asc(!)) gets "<- :Motorolan"
then $gettok(<- :Motorolan,2,$asc(:)) gets "Motorolan"

As u can see tokens are not just used to create small arrays of values, but rather can be used for a multitude of things.