diff --git a/turbopack/crates/turbopack-ecmascript/src/global_module_id_strategy.rs b/turbopack/crates/turbopack-ecmascript/src/global_module_id_strategy.rs index 8449bc787bf0b5..ae711446ba38af 100644 --- a/turbopack/crates/turbopack-ecmascript/src/global_module_id_strategy.rs +++ b/turbopack/crates/turbopack-ecmascript/src/global_module_id_strategy.rs @@ -190,20 +190,25 @@ pub async fn process_module( return Ok(()); } - let mut masked_hash = full_hash & 0xF; - let mut mask = 0xF; - while used_ids.contains(&masked_hash) { - if mask == 0xFFFFFFFFFFFFFFFF { - return Err(anyhow::anyhow!("This is a... 64-bit hash collision?")); + let mut trimmed_hash = full_hash % 10; + let mut power = 10; + while used_ids.contains(&trimmed_hash) { + if power >= u64::MAX / 10 { + // We don't want to take the next power as it would overflow + if used_ids.contains(&full_hash) { + return Err(anyhow::anyhow!("This is a... 64-bit hash collision?")); + } + trimmed_hash = full_hash; + break; } - mask = (mask << 4) | 0xF; - masked_hash = full_hash & mask; + power *= 10; + trimmed_hash = full_hash % power; } - let hashed_module_id = ModuleId::String(masked_hash.to_string().into()); + let hashed_module_id = ModuleId::String(trimmed_hash.to_string().into()); id_map.insert(ident_str, hashed_module_id.cell()); - used_ids.insert(masked_hash); + used_ids.insert(trimmed_hash); Ok(()) } diff --git a/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs b/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs index 89211f9ba94cda..65e16b175fbce9 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs @@ -245,7 +245,7 @@ impl EcmascriptChunkItem for CachedExternalModuleChunkItem { } } -/// A module that only has an ident and no content. This is used +/// A module that only has an ident and no content nor references. It is used /// to include a module's ident in the module graph before the module /// itself is resolved, as is the case with NextServerComponentModule's /// "client modules" and "client modules ssr".