我正在处理一些WebSocket / PubSub代码。
我正在生成一个简单的唯一活动客户端ID,如下所示:
my $connId = $server_id . '-' . fileno($sock);
正常工作,因为fileno($ sock)每个服务器始终是唯一的,添加$ server_id使其在所有服务器中都是唯一的。
然而,对于下一个分支,如果我可以使我的$ connId只是一个整数将是方便的。 因此,寻找一些不错的XOR或其他快速逻辑来防止碰撞而不需要 - 。
UUID会有点矫枉过正,因为我只需要关注活动连接。
答案 0 :(得分:1)
my $min_server_id = 1;
my $max_server_id = 12;
my $connId = fileno($sock) * ( $max_server_id - $min_server_id + 1) + ( $server_id - $min_server_id );
# later:
my $sock_fileno = int( $connId / ( $max_server_id - $min_server_id + 1 ) );
my $server_id = $connId % ( $max_server_id - $min_server_id + 1 ) + $min_server_id;
答案 1 :(得分:0)
ulimit -n
告诉您可以拥有多少文件,这与fileno返回的文件描述符的最大数量一致。因此,请使用比此更大的乘数 - 我建议使用10的下一个幂 - 并将服务器编号乘以它,然后添加fileno
。