使用System.identityHashCode(Obj)可靠地返回唯一ID

时间:2014-11-13 13:31:30

标签: java session websocket uniqueidentifier

我在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)会不错?

2 个答案:

答案 0 :(得分:3)

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

鉴于可能发生碰撞,为什么要冒风险呢?这可能导致的错误将是微妙的和刺激性的追踪。

答案 1 :(得分:1)

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);
    }

}