所以我有一个游戏,我在登录后将玩家对象放入数组中,在速度方面我没有遇到太多问题,因为我还存储了玩家的数组索引,但在某些系统中我在速度方面确实会遇到麻烦。
E.G.一个玩家想要向另一个玩家“发送消息”,客户端发送一个数据包,其中包含该人的姓名(例如唯一的长值),然后循环遍历整个玩家列表数组并比较姓名的长值并将其发送到找到的玩家之后播放器。
为了加快速度,我的想法是创建一个 HashMap,它使用 Long 值作为键来保证 o(1) 查找,尽管这只是一个概念,我还没有尝试过。
(我在登录时存储名称的 nameHash/long 值,因此计算它不会成为瓶颈)
这能保证我进行 o(1) 次查找吗?字符串的长值真的是唯一的吗?
字符串转long(int64)方法->
public static long toLong(String s) {
long l = 0L;
for(int i = 0; i < s.length() && i < 12; i++) {
char c = s.charAt(i);
l *= 37L;
if(c >= 'A' && c <= 'Z') l += (1 + c) - 65;
else if(c >= 'a' && c <= 'z') l += (1 + c) - 97;
else if(c >= '0' && c <= '9') l += (27 + c) - 48;
}
while(l % 37L == 0L && l != 0L) l /= 37L;
return l;
}
The game ticks on 600ms and runs with 300/400 players so operations like this really are a bottleneck
最佳答案
看来你想太多了。 String 已经有 hashcode 函数了,那为什么还需要把它重新发明成 long 呢?您可以直接将名称添加为 HashMap 中的键。
关于java - 基于long值的HashMap,get/put o(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28902275/