java - 基于long值的HashMap,get/put o(1)?

标签 java performance hashmap

所以我有一个游戏,我在登录后将玩家对象放入数组中,在速度方面我没有遇到太多问题,因为我还存储了玩家的数组索引,但在某些系统中我在速度方面确实会遇到麻烦。

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/

相关文章:

c# - 从 C# 发送无符号字节,在 Java 中作为有符号字节接收

java - 在 ViewPager 中选择要开始的 fragment - Android

Java Swing 。从 JButton 打开一个新的 JPanel 并使按钮变得漂亮

c++ - 如何在 C++ 中优化输入/输出

java - 如何访问 map 中嵌套 map 中的项目 (Java)

javax.xml.ws.soap.SOAPFaultException : None of the policy alternatives can be satisfied

javascript - MongoDB插入多个文档,其中可能有重复的_id

mysql - 搜索多个字段mysql的最快方法

java - HashMap 返回 Integer 键的错误值

java - 为什么 loadfactor 是 0.75