id_by_name()

From: Sammy (samedi@dhc.net)
Date: 02/05/97


obCircle:

I realized recently that get_id_by_name() searches the entire player_table
for a string match.  I've seen player_tables upwards of 1500, which means
1500 long string compares that I think are unnecessary.  How about setting
up a hash table with 200 entries based on the first 3 chars of the
player's name?  Also, add struct player_index_element *next to struct
player_index_element.

For example, we could use this instead:

long get_id_by_name(char *name)
{
  int i;
  struct player_index_element *tmp;

  one_argument(name, arg);

  i = (('z' - *arg) + ('z' - *(arg+1)) + ('z' - *(arg+3))) % 200;

  if(player_index[i] != NULL)
    for(tmp = player_index[i]; tmp, tmp = tmp->next)
      if(!strcmp(tmp->name, arg))
	return(tmp->id);

  return(-1);
}

The code to build a hashed index is longer than I'm gonna attempt to write
in my mailer, but you get the idea :)

This would be really helpful for mobs and objects as well.  It's gotta
save heaps of search time in a big mud.

Sam

+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
|   http://cspo.queensu.ca/~fletcher/Circle/list_faq.html   |
+-----------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/18/00 PST