mirror of
https://github.com/NixOS/nix
synced 2025-07-07 06:01:48 +02:00
Implement multi-threaded BLAKE3 hashing
This commit is contained in:
parent
b1783ff615
commit
7db388f597
2 changed files with 23 additions and 2 deletions
|
@ -307,11 +307,31 @@ static void start(HashAlgorithm ha, Ctx & ctx)
|
||||||
else if (ha == HashAlgorithm::SHA512) SHA512_Init(&ctx.sha512);
|
else if (ha == HashAlgorithm::SHA512) SHA512_Init(&ctx.sha512);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BLAKE3 data size threshold beyond which parallel hashing with TBB is likely faster.
|
||||||
|
//
|
||||||
|
// NOTE: This threshold is based on the recommended rule-of-thumb from the official BLAKE3 documentation for typical
|
||||||
|
// x86_64 hardware as of 2025. In the future it may make sense to allow the user to tune this through nix.conf.
|
||||||
|
const size_t blake3TbbThreshold = 128000;
|
||||||
|
|
||||||
|
// Decide which BLAKE3 update strategy to use based on some heuristics. Currently this just checks the data size but in
|
||||||
|
// the future it might also take into consideration available system resources or the presence of a shared-memory
|
||||||
|
// capable GPU for a heterogenous compute implementation.
|
||||||
|
void blake3_hasher_update_with_heuristics(blake3_hasher * blake3, std::string_view data)
|
||||||
|
{
|
||||||
|
#ifdef BLAKE3_USE_TBB
|
||||||
|
if (data.size() >= blake3TbbThreshold) {
|
||||||
|
blake3_hasher_update_tbb(blake3, data.data(), data.size());
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
blake3_hasher_update(blake3, data.data(), data.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void update(HashAlgorithm ha, Ctx & ctx,
|
static void update(HashAlgorithm ha, Ctx & ctx,
|
||||||
std::string_view data)
|
std::string_view data)
|
||||||
{
|
{
|
||||||
if (ha == HashAlgorithm::BLAKE3) blake3_hasher_update(&ctx.blake3, data.data(), data.size());
|
if (ha == HashAlgorithm::BLAKE3) blake3_hasher_update_with_heuristics(&ctx.blake3, data);
|
||||||
else if (ha == HashAlgorithm::MD5) MD5_Update(&ctx.md5, data.data(), data.size());
|
else if (ha == HashAlgorithm::MD5) MD5_Update(&ctx.md5, data.data(), data.size());
|
||||||
else if (ha == HashAlgorithm::SHA1) SHA1_Update(&ctx.sha1, data.data(), data.size());
|
else if (ha == HashAlgorithm::SHA1) SHA1_Update(&ctx.sha1, data.data(), data.size());
|
||||||
else if (ha == HashAlgorithm::SHA256) SHA256_Update(&ctx.sha256, data.data(), data.size());
|
else if (ha == HashAlgorithm::SHA256) SHA256_Update(&ctx.sha256, data.data(), data.size());
|
||||||
|
|
|
@ -50,7 +50,8 @@ endif
|
||||||
|
|
||||||
blake3 = dependency(
|
blake3 = dependency(
|
||||||
'libblake3',
|
'libblake3',
|
||||||
version: '>= 1.5.5',
|
version: '>= 1.8.2',
|
||||||
|
method : 'pkg-config',
|
||||||
)
|
)
|
||||||
deps_private += blake3
|
deps_private += blake3
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue