Hash表和TList的结合使用。

简介:
大家知道Hash表具有对于它的KEY进行高速检索的功能。而Tlist中有可以保存自己定义的各种结构。如果将他们两个结合起来使用会是什么情况呢?

试想一下,如果在游戏中如果突然有哪个玩家断线,那么即便是我们知道这个玩家的Socket,但是要从所有玩家中检索出他的信息,也不是一件容易的事。

那我们为什么不能将Hash表和Tlist结合使用呢。在我开发的游戏中,我就是将Hash表和Tlist同时使用,来对玩家断线做相关的处理。

今天我就简单的写一下我是如何处理的。

假定有一个Tlist中(UserList)保存着游戏中某房间的所有玩家信息。玩家的信息结构如下:

RuserInfo = record

     Socket;Tsocket;

UserID:String[20];

Face:Byte;

Sex:Boolean;

Socre:Integer;

CurrStatus:Integer;

End;

PuserInfo = ^ RuserInfo;

我们来创建一个Hash表和一个Tlist表:

ScHash:= THashedStringlist.Create;

UserList:=Tlist.Create;

当某一玩家加入游戏时这样处理。

New(P_User)

P_User.Socket=3500

P_User.UserID:=’fxh7622’;

P_User.Face:=3;

P_User.Sex:=true;

P_User.Socre:=1000;

P_User.CurrStatus:=0;

Index:=ScHash.IndexOf(IntToStr(p_User.Socket));

if Index=-1 then

begin

  ScHash.AddObject(IntToStr(p_User^.Socket),TObject(Integer(p_User)));

end;

//这里将玩家的信息以Socket作为KEY来放入Hash表中。

UserList.Add(P_User);

//在这里将玩家的信息保存在一个Tlist表中。通过前面我的文章中介绍,大家可以知道在HASH表中和在Tlist表中保存的是同一个内容,也就是说:如果修改了某玩家在Tlist中保存的信息那么他在Hash表中保存的信息也将随着修改。

这样当玩家断线以后,我们可以快速的使用Hash表来检索出是哪个玩家断线。

function TUserBaseControl.Sel_Hash(sc:TSOCKET;var p_User:PUserSocket): Boolean;

var

  t_User:PUserSocket;

  t_Object:TObject;

  Index:Integer;

begin

  Result:=false;

  Index:=ScHash.IndexOf(IntToStr(sc));

  if Index<>-1 then

  begin

    t_Object:=ScHash.Objects[Index];

    p_User:=PUserSocket(t_Object);

    Result:=true;

  end;

end;

 

检索出玩家信息以后可以将玩家信息中的相关信息进行修改。

例如:p_User.CurrStatus:=5;

 

以上的例子只是对Hash表和Tlist使用的一个小小的窍门,但是的确可以加快服务器的处理速度。希望也对大家有一个帮助。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/46105如需转载请自行联系原作者

fxh7622
相关文章
|
8月前
|
存储 C++ 容器
c++实现哈希桶
闭散列的回顾 在前面的学习中我们知道了闭散列的运算规则,当两个数据计算得到的位置发生冲突时,它会自动的往后寻找没有发生冲突的位置,比如说当前数据的内容如下: 当插入的数据为33时计算的位置为3,可是位置3已经被占领了并且4也被占领了,但是位置5没有被占领所以插入数据33就会占领位置5,那么这里的图片就如下: 这就是闭散列的插入原则,并且每个节点都有一个变量用来表示状态,这样在查找就不会出现漏查的情况,但是这样的实现会存在一个问题,扩容是根据有效数据的个数和vector容量来确定的,但是查找的时候是根据当前元素的状态是否为空来判断后面还有没有要查找的数据,如果为空的话则说明当前元素的后面没
59 0
|
4月前
|
存储 Serverless
不允许你还没有了解哈希表、哈希桶、哈希冲突的解决,如何避免冲突
不允许你还没有了解哈希表、哈希桶、哈希冲突的解决,如何避免冲突
40 0
|
10月前
|
存储 算法 Java
哈希表(散列表)详解
什么是哈希表,以及如何使用哈希表
|
10月前
|
存储 算法 JavaScript
关于散列表(哈希表)我所知道的
关于散列表(哈希表)我所知道的
42 0
|
12月前
|
存储 算法 Java
哈希表与哈希冲突(手动实现哈希桶)
哈希表与哈希冲突(手动实现哈希桶)
|
存储 Java Serverless
数据结构系列: Hash散列表
一个函数。我们可以把它定义成hash(key),其中 key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值。
119 0
数据结构系列: Hash散列表
|
存储 Java Serverless
哈希表以及哈希冲突
哈希表以及哈希冲突
93 0
哈希表以及哈希冲突
|
存储 缓存 算法
那些年,散列表和链表的混合双打
那些年,散列表和链表的混合双打
288 0
那些年,散列表和链表的混合双打
|
存储 Serverless 索引
【数据结构】 哈希表查找—哈希函数、哈希冲突
【数据结构】 哈希表查找—哈希函数、哈希冲突
228 0
【数据结构】 哈希表查找—哈希函数、哈希冲突
|
存储 Serverless
数据结构——哈希表(散列表)
数据结构——哈希表(散列表)
数据结构——哈希表(散列表)