c++ - 将空 vector 聚合或池化为最大的空 vector ?

标签 c++ g++ pool c++03

我有一个仅包含 C++ header 的模板类,它使用空 vector (0 的字符串)。字符串的长度由模板参数决定(它是一个 HKDF 实现,长度取决于底层哈希摘要的大小)。

template < class HASH >
class HKDF
{
  ...
  private:
    typedef byte NullVector[HASH::DIGESTSIZE];
    static const NullVector m_vec;
};

可以聚合各种NullVector,所有实例化的类都可以使用最大摘要大小的NullVector。例如,MD5 的摘要大小为 16 字节,而 SHA-512 的摘要大小为 64 字节。因此工具链可以生成一个 64 字节的 vector ,然后所有类,如 MD5、SHA-1、Whirlpool 和 SHA-512 都可以使用它。

这类似于字符串池,但我不希望编译器或链接器进行这种观察或看到这种模式(但我可能是错的)。所以我想给工具一个提示。

是否可以告诉编译器或链接器聚合或池化 NullVectors,并且只输出最终二进制文件中最大的?如果是,怎么办?

我经常使用 MSVC、GCC、ICC 和 Clang。我对为 GCC 兼容的编译器做这件事特别感兴趣,因为它涵盖了大多数用例。因此,如果需要,我很乐意使用特定于 GCC 的扩展。


这里有一些更多的背景故事...迭代哈希,如 MD5、SHA1 到 SHA512 和 Whirlpool 具有固定的 block 大小。对于这些散列,共享一个 64 字节的 0 数组应该没问题。我从未见过 block 大小大于 64 字节的迭代哈希,但我需要注意这一点。

递归哈希,如 SHA-3,本身 没有 block 大小。我什至不确定如何让经典的 HMAC 和 HKDF 为 SHA3 和其他递归哈希工作。

不过,您可以使用迭代和递归哈希来做同样的事情。您显然可以消化消息。但作为一个更复杂的示例,由于扩展攻击,HMAC 必须将 ipadopad 添加到迭代哈希中,但您可以生成键控摘要或 auth 标签。对于递归哈希,您只需将 key 与消息连接起来即可生成 key 摘要或身份验证标签。不需要带有递归哈希的内部或外部填充。

最佳答案

这是一个可能的解决方案,可以让您更接近,但您仍然必须决定最大尺寸应该是多少:

编辑:由于 c++03 标签而更新。以前的代码需要 c++11。

#include <cassert>
#include <cstdlib>

struct NullContainer                                                            
{                                                                               
    static const size_t LARGEST_SIZE = 1024 ;                               
    typedef unsigned char LargeNullVector[LARGEST_SIZE] ;                             
    static const LargeNullVector m_vec ;                                        
} ;             

const NullContainer::LargeNullVector NullContainer::m_vec = {0} ;

template < class HASH >                                                         
class HKDF : public NullContainer                                               
{                                                                               
} ;                                                                                              

int main()                                                                      
{                                                                               
    assert( &HKDF<int>::m_vec == &HKDF<char>::m_vec ) ;                         
    return 0;                                                                   
}   

当然,你可能想使用private inheritance在这种情况下。

关于c++ - 将空 vector 聚合或池化为最大的空 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002122/

相关文章:

c++ - 允许在窗口内设置单个像素的库

c++ - 为什么指向指针的指针是一个矩阵?

c++ - Visual C++ - 内存泄漏检测

c++ - 如何避免 C++ 匿名对象

c++ - 如何在 C++ 中创建多类型对象池

java - 未释放 Tomcat JDBC 连接资源

c++ - 使用 LONG DOUBLE, "9223372036854775807 - 1"仍然丢弃最后一位数字,结果为 "9223372036854775800"

c++ - 使用成员作为参数调用构造函数解析为变量定义

Python 进程池非守护进程?

c++ - 当 int 类型的符号不匹配时的 g++ 错误消息