From 2426170e0bd6270292c27523ca982a7e67331ee9 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Tue, 11 Apr 2023 23:09:40 -0700 Subject: [PATCH] Hash pubkeys for early out during stat retrieval --- src/k_serverstats.c | 16 +++++++++++++--- src/k_serverstats.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/k_serverstats.c b/src/k_serverstats.c index b3b259361..a71bcca4f 100644 --- a/src/k_serverstats.c +++ b/src/k_serverstats.c @@ -112,6 +112,7 @@ void SV_LoadStats(void) { trackedList[i].powerlevels[j] = READUINT16(save.p); } + trackedList[i].hash = quickncasehash((char*)trackedList[i].public_key, PUBKEYLENGTH); } } @@ -163,13 +164,17 @@ void SV_SaveStats(void) // New player, grab their stats from trackedList or initialize new ones if they're new serverplayer_t *SV_RetrieveStats(uint8_t *key) { - UINT32 j; + UINT32 j, hash; SV_InitializeStats(); + hash = quickncasehash((char*)key, PUBKEYLENGTH); + // Existing record? for(j = 0; j < numtracked; j++) { + if (hash != trackedList[j].hash) // Not crypto magic, just an early out with a faster comparison + continue; if (memcmp(trackedList[j].public_key, key, PUBKEYLENGTH) == 0) return &trackedList[j]; } @@ -184,6 +189,7 @@ serverplayer_t *SV_RetrieveStats(uint8_t *key) { trackedList[numtracked].powerlevels[j] = PR_IsKeyGuest(key) ? 0 : PWRLVRECORD_START; } + trackedList[numtracked].hash = quickncasehash((char*)key, PUBKEYLENGTH); numtracked++; @@ -193,7 +199,7 @@ serverplayer_t *SV_RetrieveStats(uint8_t *key) // Write player stats to trackedList, then save to disk void SV_UpdateStats(void) { - UINT32 i, j; + UINT32 i, j, hash; if (!server) return; @@ -208,8 +214,12 @@ void SV_UpdateStats(void) if (PR_IsKeyGuest(players[i].public_key)) continue; + hash = quickncasehash((char*)players[i].public_key, PUBKEYLENGTH); + for(j = 0; j < numtracked; j++) - { + { + if (hash != trackedList[j].hash) // Not crypto magic, just an early out with a faster comparison + continue; if (memcmp(&trackedList[j].public_key, players[i].public_key, PUBKEYLENGTH) == 0) { trackedList[j].lastseen = time(NULL); diff --git a/src/k_serverstats.h b/src/k_serverstats.h index 636e48dc9..313582e85 100644 --- a/src/k_serverstats.h +++ b/src/k_serverstats.h @@ -34,6 +34,8 @@ struct serverplayer_t uint8_t public_key[PUBKEYLENGTH]; time_t lastseen; UINT16 powerlevels[PWRLV_NUMTYPES]; + + UINT32 hash; // Not persisted! Used for early outs during key comparisons }; void SV_SaveStats(void);