如何在 socket.io 中为两个用户创建一个唯一的房间(房间 ID)?

How to create an unique room ( room id ) in socket.io for two users?

我想根据两个用户 ID 或电子邮件创建一个唯一的房间 ID。这两个用户将互相聊天。我已经制作了登录系统(node+express+handlebars)。当某个用户进入与另一个用户的私人聊天时,我想根据他们的 id 创建一个房间,所以当另一个用户执行相同的过程时,他将加入同一个房间,因为它是基于他们的 id。我试过通过将它们相乘来组合它们的 ID。示例 user1(id = 25), user2(id = 4) => roomId = 25*4 = 100。但是如果其他两个 id 为 20 和 5 的用户尝试聊天,他们将有相同的 roomId.

将您的数字 ID 转换为字符串并将它们用零填充到固定长度。然后将这两个字符串组合在一起,您将拥有一个基于两个用户 ID 的唯一名称。如果您希望它 100% 可重现,那么请确保较小的数字 id 排在第一位,以便两者始终处于相同的相对顺序。

function createRoomName(id1, id2) {
    // make sure id1 is the smaller value for
    // consistency of generation
    if (id1 > id2) {
        // swap two values
        let temp = id2;
        id2 = id1;
        id1 = temp;
    }
    return id1.toString(10).padStart(10, "0") + id2.toString(10).padStart(10, "0");
}

console.log(createRoomName(35, 19));

或者,您可以只在两组数字之间放置一个唯一字符,而不是使用填充,例如:

function createRoomName(id1, id2) {
    // make sure id1 is the smaller value for
    // consistency of generation
    if (id1 > id2) {
        // swap two values
        let temp = id2;
        id2 = id1;
        id1 = temp;
    }
    return id1 + "|" + id2;
}

console.log(createRoomName(35, 19));

仅供参考,填充或分隔符的原因如下:

2,2222

22,222

都会生成 "22222" 这会发生冲突。

仅供参考,如果您使用实际 socket.io 为两个用户生成 socket.id 而不是您自己的号码,那么这些已经是一定长度的唯一字符串,您可以直接将它们组合为字符串以获得唯一的房间名称。