diff --git a/internal/cli/mfer.go b/internal/cli/mfer.go index 2277e8c..f1ef518 100644 --- a/internal/cli/mfer.go +++ b/internal/cli/mfer.go @@ -156,7 +156,7 @@ func (mfa *CLIApp) run(args []string) { }, &cli.StringFlag{ Name: "seed", - Usage: "Seed value for deterministic manifest UUID (hashed 150M times with SHA-256, ~5-10s)", + Usage: "Seed value for deterministic manifest UUID", EnvVars: []string{"MFER_SEED"}, }, ), diff --git a/mfer/builder.go b/mfer/builder.go index 2696744..0e2beb2 100644 --- a/mfer/builder.go +++ b/mfer/builder.go @@ -92,25 +92,12 @@ type Builder struct { fixedUUID []byte // if set, use this UUID instead of generating one } -// seedIterations is the number of SHA-256 rounds used to derive a UUID from a seed. -// Tuned to take approximately 5-10 seconds on modern hardware. -const seedIterations = 150_000_000 - // SetSeed derives a deterministic UUID from the given seed string. -// The seed is hashed 150,000,000 times with SHA-256 to produce -// 16 bytes used as a fixed UUID for the manifest (~5-10s on modern hardware). +// The seed is hashed once with SHA-256 and the first 16 bytes are used +// as a fixed UUID for the manifest. func (b *Builder) SetSeed(seed string) { - b.fixedUUID = deriveSeedUUID(seed, seedIterations) -} - -// deriveSeedUUID hashes the seed string n times with SHA-256 -// and returns the first 16 bytes as a UUID. -func deriveSeedUUID(seed string, iterations int) []byte { hash := sha256.Sum256([]byte(seed)) - for i := 1; i < iterations; i++ { - hash = sha256.Sum256(hash[:]) - } - return hash[:16] + b.fixedUUID = hash[:16] } // NewBuilder creates a new Builder. diff --git a/mfer/builder_test.go b/mfer/builder_test.go index 5c1fb11..5f96406 100644 --- a/mfer/builder_test.go +++ b/mfer/builder_test.go @@ -150,15 +150,17 @@ func TestBuilderDeterministicOutput(t *testing.T) { assert.Equal(t, out1, out2, "two builds with same input should produce byte-identical output") } -func TestDeriveSeedUUID(t *testing.T) { - // Use a small iteration count for testing (production uses 1B) - uuid1 := deriveSeedUUID("test-seed-value", 1000) - uuid2 := deriveSeedUUID("test-seed-value", 1000) - assert.Equal(t, uuid1, uuid2, "same seed should produce same UUID") - assert.Len(t, uuid1, 16, "UUID should be 16 bytes") +func TestSetSeedDeterministic(t *testing.T) { + b1 := NewBuilder() + b1.SetSeed("test-seed-value") + b2 := NewBuilder() + b2.SetSeed("test-seed-value") + assert.Equal(t, b1.fixedUUID, b2.fixedUUID, "same seed should produce same UUID") + assert.Len(t, b1.fixedUUID, 16, "UUID should be 16 bytes") - uuid3 := deriveSeedUUID("different-seed", 1000) - assert.NotEqual(t, uuid1, uuid3, "different seeds should produce different UUIDs") + b3 := NewBuilder() + b3.SetSeed("different-seed") + assert.NotEqual(t, b1.fixedUUID, b3.fixedUUID, "different seeds should produce different UUIDs") } func TestBuilderBuildEmpty(t *testing.T) {