MCPcopy Create free account
hub / github.com/axmolengine/axmol / computeFileDigest

Function computeFileDigest

core/base/Utils.cpp:454–502  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

452}
453
454std::string computeFileDigest(std::string_view filename,
455 std::string_view algorithm,
456 uint32_t bufferSize,
457 DigestPresent present)
458{
459 if (filename.empty())
460 return std::string{};
461
462 auto fs = FileUtils::getInstance()->openFileStream(filename, FileStream::Mode::READ);
463
464 if (!fs || !fs->isOpen())
465 return std::string{};
466
467 std::unique_ptr<uint8_t[]> buffer(new uint8_t[bufferSize]);
468 unsigned char mdValue[EVP_MAX_MD_SIZE] = {0};
469 unsigned int mdLen = 0;
470
471 OpenSSL_add_all_digests();
472 const EVP_MD* md = EVP_get_digestbyname(algorithm.data());
473 if (!md)
474 return std::string{};
475
476 EVP_MD_CTX* mdctx = EVP_MD_CTX_create();
477 auto ok = EVP_DigestInit(mdctx, md);
478 if (!ok)
479 {
480 EVP_MD_CTX_destroy(mdctx);
481 return std::string{};
482 }
483
484 int bytesRead;
485 while ((bytesRead = fs->read(buffer.get(), bufferSize)) > 0)
486 {
487 EVP_DigestUpdate(mdctx, buffer.get(), bytesRead);
488 }
489
490 EVP_DigestFinal(mdctx, mdValue, &mdLen);
491 EVP_MD_CTX_destroy(mdctx);
492
493 switch (present)
494 {
495 case DigestPresent::Base64:
496 return base64Encode(std::span<uint8_t>{mdValue, mdLen});
497 case DigestPresent::Hex:
498 return bin2hex(std::string_view{(const char*)mdValue, (size_t)mdLen});
499 default:
500 return std::string{(const char*)mdValue, (size_t)mdLen};
501 }
502}
503
504LanguageType getLanguageTypeByISO2(const char* code)
505{

Callers 1

getFileMD5HashFunction · 0.85

Calls 9

getInstanceFunction · 0.85
bin2hexFunction · 0.85
openFileStreamMethod · 0.80
isOpenMethod · 0.80
base64EncodeFunction · 0.70
emptyMethod · 0.45
dataMethod · 0.45
readMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected