我想将Qt C++11函数移植到标准C++11,该函数有一个接受任何类型数据(文本、二进制数据等)的QByteArray参数。并从数据中计算哈希。
fromRawData()**.**看起来非常适合,因为它可以携带任何类型的数据,并且具有许多功能,允许从流、设备、字符串等填充数据。甚至可以在不使用进行深度复制的情况下包装数据。
是否有提供类似灵活性的标准C++11解决方案?目前,我倾向于使用好的老void*加大小。
发布于 2016-11-23 22:36:43
是否有提供类似灵活性的标准C++11解决方案?目前,我倾向于使用好的旧的空*加大小。
没有标准的C++11解决方案可以提供既可以管理自己的内存,也可以包装由其他人管理的内存的容器。
如果许可条款允许,您可以简单地复制QByteArray (它是几个文件)并将其与您的项目捆绑在一起。
否则,如果您只打算为所有元素处理具有连续存储的容器,那么const void*和size_t参数将是非常有意义的,并且将是最可移植的和适应性最强的。您可以根据需要提供方便的重载。例如。
HashType calculateHash(const void*, size_t);
template <typename T> HashType calculateHash(const T& container) {
static_assert(sizeof(typename T::value_type) == 1, "value_type must be byte-sized");
assert(&container[container.size()-1] == &container[0]+container.size());
return calculateHash(&container[0], container.size());
}为了支持任何容器,甚至那些具有非连续存储的容器,基本calculateHash可以选择一个范围,并为散列整个容器提供过载。
template <typename I>
HashType calculateHash(I start, I const end) {
HashType hash;
for (; start != end; ++start)
hash.update(*start);
return hash;
}
template <typename C>
HashType calculateHash(const C& container) {
using std::begin;
using std::end;
return calculateHash(begin(container), end(container));
}发布于 2016-11-23 21:50:47
我不知道这样的标准容器,它具有与QByteArray相同的复杂功能,但我将从std::vector< char >开始,用缺少的和必要的函数实现包装器。
std::vector具有很高的灵活性,您可以在固定时间内访问每个元素,并且可以轻松地将其转换为std::string (例如,将向量转换为字符串)。
如果插入操作更重要,也许可以尝试std::list< char >。这主要是链表实现。
根据Jesper的注释:使用uint8_t作为模板参数将描述真正的字节数组行为。
https://stackoverflow.com/questions/40774637
复制相似问题