From eecbe3765451e5c7bc95444d6f3a983787bca2e0 Mon Sep 17 00:00:00 2001 From: Benjamin Gaussorgues Date: Wed, 20 May 2026 15:00:25 +0200 Subject: [PATCH] chore(snowflake): add more randomness in server id fallback Signed-off-by: Benjamin Gaussorgues --- lib/private/Snowflake/SnowflakeGenerator.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/private/Snowflake/SnowflakeGenerator.php b/lib/private/Snowflake/SnowflakeGenerator.php index fcadc2a2a8c..fa07f398583 100644 --- a/lib/private/Snowflake/SnowflakeGenerator.php +++ b/lib/private/Snowflake/SnowflakeGenerator.php @@ -34,7 +34,7 @@ final readonly class SnowflakeGenerator implements ISnowflakeGenerator { // Relative time [$seconds, $milliseconds] = $this->getCurrentTime(); - $serverId = $this->getServerId() & 0x1FF; // Keep 9 bits + $serverId = $this->getServerId(); // Already 9 bits $isCli = (int)$this->isCli(); // 1 bit $sequenceId = $this->sequenceGenerator->nextId($seconds, $milliseconds, $serverId); // 12 bits if ($sequenceId > 0xFFF || $sequenceId === false) { @@ -104,12 +104,20 @@ final readonly class SnowflakeGenerator implements ISnowflakeGenerator { /** * Return configured serverid or generate one if not set + * + * @return int<0,511> */ private function getServerId(): int { $serverid = $this->config->getSystemValueInt('serverid', -1); - return $serverid > 0 - ? $serverid - : crc32(gethostname() ?: random_bytes(8)); + if ($serverid < 1) { + // Fallback: generates a server ID based on hostname + // or random bytes if hostname isn't available + /** @var int<0,max> */ + $serverid = hexdec(hash('xxh32', gethostname() ?: random_bytes(8))); + } + + /** @var int<0,511> */ + return $serverid & 0x1FF; } private function isCli(): bool {