One idea is a token delimiter you won't run into within your scheme. Like a character illegal to your names. Like most likely a period "." In which case you could keep one table for everything by building tokenized item names to have a value so You'd have something like:

Code
Striker.RealName = ...
Striker.Hits = ...
Striker.Kills = ...
Bizon.RealName = ...
Bizon.Hits = ...
Bizon.Kills = ...
Fennec.RealName = ...
Fennec.Hits = ...
Fennec.Kills = ...
Uzi.RealName = ...
Uzi.Hits = ...
Uzi.Kills = ...


Iterating a list like this might be more cumbersome than like using $ini(), for instance maybe you need to iterate topics. You'd commonly look at: $ini(file,0) which would in this case from what you provided, return 5. and $ini(file,1) would return "Striker"
changing from 1 to any of these: 2 = "Bizon", 3 = "Fennec", 4 = "Uzi", 5 = "Weekly"

You can Mimic this behavior also with hash tables, but you'd need to use $hfind(). I'm assuming you're never going to be more than 1 tokenized level deep, and "RealName" is a required field for every topic which gives us a nice search parameter.

$hfind(Table,*.RealName,0,w) == 4 (since Weekly has no RealName)

Now you have a value to loop through, so for instance:
$hfind(Table,*.RealName,1,w) == Striker.RealName

But really we're after the ini Equivalent of "Topic" IE: [Striker] so we really don't want the .RealName part...

var %Topic = $gettok($hfind(Table,*.RealName,1,w),1,46)

Now we have %Topic set as "Striker" which now we can do useful stuff like

echo -a Kills for: $qt($hget(Table,%Topic $+ .RealName)) == $hget(Table,%Topic $+ .Kills)

and get an output result like:

Kills for: "Striker 45" == 1007

===================================================================================================

Sometimes You want to iterate items within a topic as you don't know how many there are, you'd commonly do like this:
$ini(file,Striker,0) which by your provided list, would return 8.
$ini(file,Striker,1) would return RealName.

In order to do this we'll have to utilize $hfind() again to mimic this behavior. I'm going to assume you found the "topic" and have it set in the variable "%Topic".
$hfind(table,%Topic $+ .*,0,w) will return us our number: 8.

Now assuming you're using some form of a loop to iterate all these items, to get it like $ini(..,..,1) we're going to need to grab the 2nd token from the returned value:
var %Item = $gettok($hfind(table,%Topic $+ .*,1,w),2,46)

Now we know: %Topic is "Striker" and %Item is "RealName" and we could piece these together to grab the output like:

echo -a From Topic: $qt(%Topic) Item: $qt(%Item) == $hget(table,%Topic $+ . $+ %Item)

and get a result like:

From Topic: "Striker" Item: "RealName" == Striker 45


This is just very brief, and an introductory of one possibility to keep all the data within one hash table. I hope these examples help you morph your INI version into a hash table version. Keep in mind also that hash tables are within memory, if you do not /hsave them periodically, in an event of computer crash, power outage, accidentally exiting mIRC, etc... you could lose any potential updates pushed into your table.

Also don't forget to load your saved table before attempting to update any values if you just started mIRC. mIRC does not re-load any tables you had in memory on start. You only need to load once, then it's in memory until you delete the table or close mIRC again.

Typically you'd load saved tables on start of mIRC, or you could implement a checker to check for the existence of the table, and if it doesn't exist, load it first.