* This file is part of the MindStudio project.
* Copyright (c) 2025 Huawei Technologies Co.,Ltd.
*
* MindStudio is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*/
#include <sstream>
#include <iomanip>
#include "calculate_data_check_sum.h"
constexpr uint64_t DATA_CHECKSUM64_POLYNOMIAL = 0x42F0E1EBA9EA3693ULL;
constexpr uint64_t DATA_CHECKSUM64_INITIAL_VALUE = 0xFFFFFFFFFFFFFFFFULL;
constexpr uint64_t DATA_CHECKSUM64_XOR_OUTPUT = 0xFFFFFFFFFFFFFFFFULL;
constexpr int DATA_CHECKSUM64_TABLE_SIZE = 256;
constexpr int BITS_PER_BYTE = 8;
static uint64_t g_checksum64Table[256];
static void InitializeTable()
{
static bool tableInitialized = false;
if (tableInitialized) {
return;
}
for (int i = 0; i < DATA_CHECKSUM64_TABLE_SIZE; ++i) {
uint64_t checksum = static_cast<uint64_t>(i);
for (int j = 0; j < BITS_PER_BYTE; ++j) {
if ((checksum & 1) != 0) {
checksum = (checksum >> 1) ^ DATA_CHECKSUM64_POLYNOMIAL;
} else {
checksum >>= 1;
}
}
g_checksum64Table[i] = checksum;
}
tableInitialized = true;
}
std::string CalculateDataCheckSum64(const std::vector<uint8_t>& data)
{
InitializeTable();
uint64_t checksum = DATA_CHECKSUM64_INITIAL_VALUE;
for (auto byte : data) {
uint8_t index = static_cast<uint8_t>(checksum ^ byte);
checksum = (checksum >> BITS_PER_BYTE) ^ g_checksum64Table[index];
}
checksum ^= DATA_CHECKSUM64_XOR_OUTPUT;
std::stringstream ss;
static size_t valueWide = 16;
ss << std::hex << std::setw(valueWide) << std::setfill('0') << checksum;
return ss.str();
}