是否使用 System.identityHashCode(Obj) 可靠返回唯一 Id



我在dropwizard服务中实现了websocket,他们需要在服务器端实现会话管理。在连接上,我们得到会话对象,这是客户端和服务器之间的通信链路。但是没有办法像session.getId()那样获取会话的唯一id,我需要id进行会话管理。

所以我一直在考虑使用System.identityHashCode(Session)来获取唯一的id并使用此ID处理会话。

仅供参考,websocket onConnect 结构是

@OnWebSocketConnect
public void onOpen(Session session) throws IOException
{    
 // code to add the session in session management using unique id
}

所以使用System.identityHashCode(Session)会很好吗?

identityHashMap 通常派生自内存地址或绑定到线程的随机数生成器,然后在 JVM 首次使用时存储在对象标头中。碰撞的可能性很低,但并非不可能。

鉴于可能发生碰撞,为什么要冒险呢? 这可能导致的错误将是微妙的,并且令人恼火。

WebSocketSessionSession的实现。它覆盖hashCodeequals,因此可以在使用超过 4GB 内存的程序中安全地进行哈希处理。也就是说,会话关键。

你可以做这样的事情:

class YourClass 
{
    private Set<Session> managedSessions = new HashSet<Session>();
    // or use a Map<Session,Data> if you want to store associated data
    @OnWebSocketConnect
    public void onOpen(Session session) throws IOException
    {    
        if (managedSessions.contains(session)) {
            // working with preexisting session
        } else {
            managedSessions.add(session);
        }
    }
    @OnWebSocketClose
    public void onClose(Session session, int statusCode, String reason) 
    {
        managedSessions.remove(session);
    }
}

相关内容

  • 没有找到相关文章

最新更新