turbopack: reduce EffectStateStorage memory by storing u128 content hashes (#92902)
### What?
In `turbo-tasks-fs`, the `WriteEffect` and `WriteLinkEffect` structs now
store a precomputed `u128` xxh3 content hash instead of returning the
full `ReadRef<PersistedFileContent>` / `ReadRef<LinkContent>` from their
`Effect::value()` implementations.
The associated type `Effect::Value` is changed from
`ReadRef<PersistedFileContent>` / `ReadRef<LinkContent>` to `u128` for
both effect types.
`LinkContent` gains a `DeterministicHash` derive to support hashing via
`hash_xxh3_hash128`.
### Why?
`EffectStateStorage` stores the last-applied value for each effect key
in `last_applied: Mutex<Option<Box<dyn Any + Send + Sync>>>` to enable a
double-checked deduplication fast path (skip re-writing a file if
content hasn't changed). In long-running sessions this map grows
continuously and holds onto a lot of memory because it stores full file
content (`ReadRef<PersistedFileContent>`) or full link content
(`ReadRef<LinkContent>`) for every file ever written.
Storing a `u128` hash (16 bytes) instead of the full content
significantly reduces memory usage while preserving the deduplication
semantics (hash equality implies content equality with negligible
collision probability).
### How?
- Added `content_hash: u128` field to `WriteEffect` and
`WriteLinkEffect`, computed at construction time using
`hash_xxh3_hash128` (xxh3 128-bit non-cryptographic hash, already used
elsewhere in turbopack for content addressing).
- Changed `Effect::Value = u128` for both effect types; `value()`
returns `&self.content_hash`.
- The `EffectStateStorage` now stores `Box<u128>` (24 bytes on the heap)
per entry instead of `Box<ReadRef<...>>` which held a reference-counted
pointer into potentially large file content.
- No changes to `EffectStateStorage`, `Effects::apply()`, or `DynEffect`
vtable — the existing `Any`/`DynPartialEq` machinery works transparently
with `u128`.
<!-- NEXT_JS_LLM_PR -->
Co-authored-by: Tobias Koppers <sokra@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>