【发布时间】:2020-12-25 06:08:46
【问题描述】:
我正在尝试实现 SHA256 哈希函数,以便在程序中使用一些编译时功能。预处理的一个步骤是在给定公式的情况下填充消息/输入数据。填充量自然必须是正整数。该算法依赖于块处理,每个块只能容纳这么多的数据,所以如果数据大于一个块,我们需要更多的块。我使用递归解决了这个问题,但这会引发 C1202 - 模板定义是递归的或超出了复杂性限制。
template <uint32_t DataLength, uint32_t ChunkSize, uint32_t Chunks>
int GetBitsToAppend() {
static int BitsToAppend = ChunkSize*Chunks - DataLength - 1 - (ChunkSize / 8);
return 0 > BitsToAppend ? GetBitsToAppend<DataLength, ChunkSize, Chunks+1>() : BitsToAppend;
}
我尝试通过添加显式模板定义来解决它,但这反而引发了一个新错误; C2768,非法使用显式模板参数。代码如下:
template<uint32_t DataLength, uint32_t ChunkSize>
int GetBitsToAppend<DataLength, ChunkSize, 1024>() {
int BitsToAppend = ChunkSize*Chunks - DataLength - 1 (ChunkSize / 8)
}
如果我使用正常的循环函数,它会按预期工作,但是由于在编译时需要知道处理数组的长度,这会中断。例如:
int GetBitsToAppend(uint32_t DataLength, uint32_t ChunkSize, uint32_t Chunks) {
static int BitsToAppend = ChunkSize * Chunks - DataLength - 1 - (ChunkSize>>3);
return 0 > BitsToAppend ? GetBitsToAppend(DataLength, ChunkSize, Chunks+1) : BitsToAppend;
}
template <typename T, size_t OutputSize, size_t ByteSizeInput, size_t Rounds, size_t ChunkSize>
std::bitset<OutputSize> SHA(const T data) {
// Pre-processing
const uint32_t DataLength = ByteSizeInput << 3;
const uint32_t BitsToAppend = GetBitsToAppend(DataLength, ChunkSize, 1); // Run-time calculation
const uint32_t TargetSize = (DataLength + BitsToAppend + (ChunkSize>>3) + 1) / sizeof(uint32_t);
std::array<uint32_t, TargetSize> ProcessArray; // Invalid template argument.
// Copy data into ProcessArray and perform remaining preprocessing
//........
ChunkSize 是常量,由函数的模板参数给出,ByteSizeInput 也是如此。 ChunkSize>>3是指在预处理中附加的整数的大小,在SHA256/224中为64位,在SHA384/512中为128位。阿卡。相应的块大小除以八。
有谁知道如何解决这个问题?
【问题讨论】: