游戏引擎资源库的资源guid是用什么算法生成的?
# include & lttime.h & gt
# include & ltstdlib.h & gt
# include & ltdos.h & gt
# include & ltWindows.h & gt
# include & ltiostream & gt
# include & ltvector & gt
# include & lt地图& gt
typedef unsigned _ _ int 64 u _ int 64 _ t;
typedef无符号int u _ int 32 _ t;
const u _ int 64 _ t c _ mark _ time _ stamp = 0x ffffffff 0000000;/*时间戳掩码*/
const u _ int 64 _ t c _ mark _ district = 0x 00000000 fff 00000;/*服务器区号掩码*/
const u _ int 64 _ t c _ mark _ plat = 0x 0000000000 ff 000;/*服务器中的平台号掩码*/
const u _ int 64 _ t c _ mark _ base = 0x 000000000000 fff;/*本地身份证号码掩码*/
//在所有游戏服务器中生成全局唯一的ID,可以防止ID相同时难以处理的各种问题。
u_int64_t GenNewGUID()
{
static u _ int 32 _ t baseId = 0;
baseid++;
u_int64_t时间戳= (u_int64_t)时间(空);
u _ int 32 _ t district num = 1;/*此服务器区号可根据实际情况设置或获取*/
u _ int 32 _ t platNum = 1;/*该平台号可根据实际情况设置或获取*/
u_int64_t newId =((时间戳& lt& lt32)& amp;c _ mark _ time _ stamp)|((district num & lt;& lt20)& amp;c _ mark _ district)|((platNum & lt;& lt12)& amp;c _ mark _ plat)|(baseId & amp;c _ mark _ base);
返回newId
}
int _tmain(int argc,_TCHAR* argv[])
{
STD::vector & lt;u _ int64 _ t & gtidList
STD::map & lt;u_int64_t,u _ int64 _ t & gtidMap
DWORD dwlastime =::GetTickCount();
DWORD dwCurTime = 0;
u _ int64 _ t uMaxIdOneSec = 4096//此算法支持在1秒内生成uMaxIdOneSec GUID。如果超过该值,将出现重复值。
u _ int 64 _ t uSecondCnt = 0;//计算它已经运行了多少秒。
u _ int 64 _ t uSecondOver = 2;//生成uSecondOver秒后停止。此时会生成uMaxIdOneSec * uSecondOver GUID。
while(真)
{
dwCurTime =::GetTickCount();
if(dwCurTime-dwlastime & gt;= 1000)
{
dwLastTime = dwCurTime
usecondcnt++;
if(uSecondCnt & gt;= uSecondOver)break;
}
if(id list . size()& lt;uMaxIdOneSec *(uSecondCnt+1))
{
id list . push _ back(GenNewGUID());
}
}
for(STD::vector & lt;u _ int64 _ t & gt*迭代器it = id list . begin();它!= id list . end();it++)
{
id map[* it]= 0;
}
if(id list . size()& gt;idMap.size())
{
//这两个大小不相等,这意味着有重复的id。证明算法失败!请检查uMaxIdOneSec是否为4096!!
MessageBox(NULL,L "具有相同的id!!!",L“标题”,MB _ OK);
}
/**