Skip to content

Commit

Permalink
assets: use blake3 instead of md5 (bevyengine#10208)
Browse files Browse the repository at this point in the history
# Objective

- Replace md5 by another hasher, as suggested in
bevyengine#8624 (comment)
- md5 is not secure, and is slow. use something more secure and faster

## Solution

- Replace md5 by blake3


Putting this PR in the 0.12 as once it's released, changing the hash
algorithm will be a painful breaking change
  • Loading branch information
mockersf authored and Ray Redondo committed Jan 9, 2024
1 parent 3079eaa commit 7d47fd0
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 12 deletions.
2 changes: 1 addition & 1 deletion crates/bevy_asset/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ crossbeam-channel = "0.5"
downcast-rs = "1.2"
futures-io = "0.3"
futures-lite = "1.12"
md5 = "0.7"
blake3 = "1.5"
parking_lot = { version = "0.12", features = ["arc_lock", "send_guard"] }
ron = "0.8"
serde = { version = "1", features = ["derive"] }
Expand Down
20 changes: 9 additions & 11 deletions crates/bevy_asset/src/meta.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,27 +225,25 @@ pub(crate) fn loader_settings_meta_transform<S: Settings>(
})
}

pub type AssetHash = [u8; 16];
pub type AssetHash = [u8; 32];

/// NOTE: changing the hashing logic here is a _breaking change_ that requires a [`META_FORMAT_VERSION`] bump.
pub(crate) fn get_asset_hash(meta_bytes: &[u8], asset_bytes: &[u8]) -> AssetHash {
let mut context = md5::Context::new();
context.consume(meta_bytes);
context.consume(asset_bytes);
let digest = context.compute();
digest.0
let mut hasher = blake3::Hasher::new();
hasher.update(meta_bytes);
hasher.update(asset_bytes);
*hasher.finalize().as_bytes()
}

/// NOTE: changing the hashing logic here is a _breaking change_ that requires a [`META_FORMAT_VERSION`] bump.
pub(crate) fn get_full_asset_hash(
asset_hash: AssetHash,
dependency_hashes: impl Iterator<Item = AssetHash>,
) -> AssetHash {
let mut context = md5::Context::new();
context.consume(asset_hash);
let mut hasher = blake3::Hasher::new();
hasher.update(&asset_hash);
for hash in dependency_hashes {
context.consume(hash);
hasher.update(&hash);
}
let digest = context.compute();
digest.0
*hasher.finalize().as_bytes()
}

0 comments on commit 7d47fd0

Please sign in to comment.