Skip to content

Commit d6158a3

Browse files
thomhurstclaude
andauthored
perf: Use HashSet for O(1) secret masking lookups (#1723)
Fixes #1539 Changed BuildSystemSecretMasker from List<string> to HashSet<string> for tracking already-masked secrets. This provides O(1) lookup instead of O(n), improving performance when many secrets need to be masked. Before: O(n*m) where n=existing secrets, m=new secrets After: O(m) - each new secret is O(1) lookup HashSet.Add() returns false if the item already exists, eliminating the need for a separate Contains() check. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 22b9325 commit d6158a3

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

src/ModularPipelines/Engine/BuildSystemSecretMasker.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ internal class BuildSystemSecretMasker : IBuildSystemSecretMasker
2828
private readonly IBuildSystemFormatterProvider _formatterProvider;
2929
private readonly IConsoleWriter _consoleWriter;
3030

31-
private readonly List<string> _alreadyMaskedSecrets = new();
31+
private readonly HashSet<string> _alreadyMaskedSecrets = new();
3232
private readonly object _lock = new();
3333

3434
public BuildSystemSecretMasker(IBuildSystemFormatterProvider formatterProvider,
@@ -44,9 +44,13 @@ public void MaskSecrets(IEnumerable<string> secrets)
4444
{
4545
var formatter = _formatterProvider.GetFormatter();
4646

47-
foreach (var secret in secrets.Where(s => !_alreadyMaskedSecrets.Contains(s)))
47+
foreach (var secret in secrets)
4848
{
49-
_alreadyMaskedSecrets.Add(secret);
49+
// HashSet.Add returns false if already exists, providing O(1) lookup
50+
if (!_alreadyMaskedSecrets.Add(secret))
51+
{
52+
continue;
53+
}
5054

5155
var maskCommand = formatter.GetMaskSecretCommand(secret);
5256
if (maskCommand != null)

0 commit comments

Comments
 (0)