Skip to content

Resource identity and name hashes

Frostbite (skate.)Data modelApplies toskate.

Frostbite uses different keys for different registries. Equality in one registry does not imply equality in the others: a mesh’s manifest name, resource id and stored name hash are separate fields. Observed

Registry Identity and constraint Confidence
Bundle resource entry Name, 32-bit type id, 64-bit resource id Observed
EBX external reference File GUID plus instance GUID Observed
EBX name resolution One name must identify one partition in the measured level closure Observed
Mesh resolution One MeshSet name must identify one resource id across the loaded compartments Observed
Renderer material-owner cache Stored 32-bit mesh name hash; strings are not compared Observed
Texture streamer h64, one mip-chunk GUID per identity within a level Observed
ShaderBlockDepot registry One material key must identify one parameter block across loaded cells Observed

The mesh hash is djb2-XOR over the lowercase full resource path: start with 5381, then h = (h * 33) XOR c with 32-bit wrapping. MeshAsset stores it at +0xc8; MeshSet also stores a name hash at +0x78 and hashes for LOD names. Renaming only the manifest entry leaves these cached identities unchanged. Observed

The material-owner cache (Skate+0x3f56860) and resource-name resolution (+0x3db78d0) compare hashes only, never strings. The cache constructs its key from a mesh name hash in the upper 32 bits and a second 32-bit value from the material entry. Its 0x58-byte owner stores the slot table at +0x20 and count at +0x28. Two different paths with the same hash can therefore reuse a slot table of the wrong size. Observed

In a partial census of 241,857 names, seven hashes collide; the base-name subset has one collision among 101,590 names. Identical suffixes preserve a djb2-XOR collision, so adding _lod0 to both colliding paths cannot separate their hashes. Observed

For a level of about 50,000 generated mesh names, the chance of at least one 32-bit collision is about 25%, by the birthday bound. Inferred

The same recurrence hashes lowercase resource type names, including MeshSet 0x49b156d4, Texture 0x6bde20ba and ShaderBlockDepotResource 0x73312045. These type ids are not resource-instance ids. Observed

The 6,056 stock manifests list 428,211 resource entries of 47 distinct type ids. 26 of the ids are the djb2-XOR hash of a lowercase type name, found by hashing the type names, field names and strings of the stock EBX documents and a list of candidate class names (the same recurrence as the mesh hash above); the other 21 ids have no name yet. Observed · hashes of 303,105 distinct strings against the 47 ids

Type id Name Resources Top path directories
0x7dd4cc89 116,213 gameplay/, ui/
0x6bde20ba Texture 78,566 world/, characters/
0x49b156d4 MeshSet 49,414 world/, levels/
0xb2c465f6 34,982 audio/
0x4088bf7e 34,088 animation/
0x41759364 PhysicsResource 33,277 world/, levels/
0xd489facb ExpressionShaderRasterPermutation 28,151 expressionshader/
0x0e2b02f7 CompiledBytecode 20,429 shaders/
0x93afacc3 7,654 ui/, thumbnail/
0x5297a88f 6,784 audio/, frsr/
0x250047b2 ExpressionShaderRasterPermutationSharedData 4,533 expressionshader/
0xed27dbda 3,026 characters/
0x2fec6526 ShaderStateAssetId 2,598 levels/, items/
0x73312045 ShaderBlockDepotResource 2,490 levels/, items/
0xa19b025d ExpressionShaderBindingSet 1,198 expressionshader/
0x78791c75 900 effects/
0xf17ddabd 804 e23f05da-92dc-74dd-fe26-b1912244b73e_scalphair_wraplist_deformsettinge23f05da-92dc-74dd-fe26-b1912244b73e_scalphair_wraplist_deformsetting_wrap[4][4][0]/, e23f05da-92dc-74dd-fe26-b1912244b73e_scalphair_wraplist_deformsettinge23f05da-92dc-74dd-fe26-b1912244b73e_scalphair_wraplist_deformsetting_wrap[1][1][1]/
0x7a630735 ExpressionShaderStreamableTextureSet 477 expressionshader/
0x7d98f632 ExpressionShaderInputLayout 476 expressionshader/
0xaa8c66b5 471 audio/
0x30b4a553 OccluderMesh 442 world/
0xa8957ed6 ExpressionShaderRootSlotInitData 381 expressionshader/
0x95ce62dd ExpressionShaderComputePermutation 242 expressionshader/
0x879ba711 ExpressionShaderPermutationSharedData 102 expressionshader/
0x063994c5 82 ui/
0xe2e6955b ExpressionShaderDatabase 72 effects/, levels/
0x2d254a89 ExpressionShaderStreamableTextureSetLookupTable 72 effects/, levels/
0x85ea8656 60 characters/
0x85ac783d 60 characters/
0x8ef3938d 42 characters/
0xec383b87 30 characters/
0xde540c59 LayerGraphs 22 gameplay/, items/
0xf434940d ShaderParameterCollectionTable 9 common/, effects/
0x70c5cb3e 9 levels/, lighting/
0x428ec9d4 BundleRefTableResource 8 common/, audio/
0x589bb36e ExpressionShaderPassBinding 7 expressionshader/
0xc631492b 7 characters/
0x41d57e10 7 ui/
0x6a5be5db ExpressionShaderBindingSignature 5 expressionshader/
0x22fe8ac8 TerrainStreamingTree 4 levels/
0x1ca38e06 VisualTerrain 4 levels/
0x15e1f32e TerrainDecals 4 levels/
0x957c32b1 AtlasTexture 3 lighting/
0x89983f10 2 ui/
0xc189b12b 2 effects/
0xf04f0c81 1 systems/
0xb15ad3fd 1 levels/

A texture resource’s 64-bit streaming identity also carries this hash: its low 32 bits are the djb2-XOR hash of the texture’s lowercase resource name in all 61,618 distinct stock texture headers (see texture resources). Proven · all stock texture resources

A texture’s h64 appears at resource +0x78 and in its bundle chunk-metadata row. Base-game per-cell copies of the same streamed texture share a mip chunk; registering different chunks under one h64 causes a seam stall and failure. Observed

Base-game material keys can appear in several depots with identical blocks. A measurement of 9,306 repeated keys finds no conflicting block hashes. Registering a key with different blocks can leave a freed parameter box in the registry. Observed

The distinct mesh failures and their measured corrections are recorded in the crash catalogue.