From e621ce0763803ea821f9b41a20b0b77d83ab6c97 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 17 Nov 2024 02:28:33 +0800 Subject: [PATCH] Refactor get_port to use FNV-1a hash for consistency across platforms (#634) Fix ZMQ issue caused by mismatched port values between macOS and Linux --- msgq/impl_zmq.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/msgq/impl_zmq.cc b/msgq/impl_zmq.cc index 434888e..e6705e6 100644 --- a/msgq/impl_zmq.cc +++ b/msgq/impl_zmq.cc @@ -7,10 +7,19 @@ #include "msgq/impl_zmq.h" +static size_t fnv1a_hash(const std::string &str) { + const size_t fnv_prime = 0x100000001b3; + size_t hash_value = 0xcbf29ce484222325; + for (char c : str) { + hash_value ^= (unsigned char)c; + hash_value *= fnv_prime; + } + return hash_value; +} + //FIXME: This is a hack to get the port number from the socket name, might have collisions static int get_port(std::string endpoint) { - std::hash hasher; - size_t hash_value = hasher(endpoint); + size_t hash_value = fnv1a_hash(endpoint); int start_port = 8023; int max_port = 65535; int port = start_port + (hash_value % (max_port - start_port));