我正在寻找解决方案如何计算数据结构的哈希。让我们假设我们有这样一个结构:
struct A
{
float64_t array[4][4];
float64_t x;
float64_t y;
uint8_t validationHash[32]; // here computed hash need to be stored
}
我还有函数Sha256(contchar*input,uint8\t(
Sha256的实现和这里一样http://www.zedwood.com/article/cpp-sha256-function
与大多数加密哈希实现一样,您链接到的SHA-256哈希函数接受字节数组作为其输入。因此,第一步是序列化要散列的数据。
这不像将结构转换为字节数组那么简单。序列化应该可以在操作系统和硬件之间移植。结构对齐、endianness等在系统之间可能会有所不同,因此最好使用序列化库,并将所有这些棘手的严格别名问题留给库作者。
由于您似乎已经在使用Boost(float64_t
类型),因此可以使用Boost序列化库。首先,创建一个序列化函数来指示Boost如何序列化A
:
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, A & a, const unsigned int version)
{
ar & a.array;
ar & a.x;
ar & a.y;
}
} // namespace serialization
} // namespace boost
然后,将其序列化为内存中的流:
std::ostringstream plaintext_buffer {};
{
boost::archive::binary_oarchive oa(plaintext_buffer);
oa << a;
}
std::string plaintext = plaintext_buffer.str();
现在可以使用SHA-256哈希函数了。我把那部分留给你做练习。
纯文本。data()
表示数据,而表示纯文本。尺寸()
用于尺寸a.validationHash
根据注释,您仅限于C 03(我将其视为C 98),并且不能使用任何库。首先,让我们使用最接近的等价标准类型重新定义函数:
struct A
{
double array[4][4];
double x;
double y;
uint8_t validationHash[32]; // here computed hash need to be stored
}
我稍微修改了这个答案:用C序列化double和float,它声称是一个可移植的IEEE 754序列化程序。凉的我将输出更改为内存缓冲区,替换了goto
,并将C转换为static\u cast
。
void serializeIeee754(double x, uint8_t* destination)
{
int shift;
unsigned long sign, exp, hibits, hilong, lowlong;
double fnorm, significand;
int expbits = 11;
int significandbits = 52;
if(x == 0) {
/* zero (can't handle signed zero) */
hilong = 0;
lowlong = 0;
} else if(x > DBL_MAX) {
/* infinity */
hilong = 1024 + ((1 << (expbits - 1)) - 1);
hilong <<= (31 - expbits);
lowlong = 0;
} else if(x < -DBL_MAX) {
/* -infinity */
hilong = 1024 + ((1 << (expbits - 1)) - 1);
hilong <<= (31 - expbits);
hilong |= (1 << 31);
lowlong = 0;
} else if(x != x) {
/* NaN - dodgy because many compilers optimise out this test
* isnan() is C99, POSIX.1 only, use it if you will.
*/
hilong = 1024 + ((1 << (expbits - 1)) - 1);
hilong <<= (31 - expbits);
lowlong = 1234;
} else {
/* get the sign */
if(x < 0) {
sign = 1;
fnorm = -x;
} else {
sign = 0;
fnorm = x;
}
/* get the normalized form of f and track the exponent */
shift = 0;
while(fnorm >= 2.0) {
fnorm /= 2.0;
shift++;
}
while(fnorm < 1.0) {
fnorm *= 2.0;
shift--;
}
/* check for denormalized numbers */
if(shift < -1022) {
while(shift < -1022) {
fnorm /= 2.0;
shift++;
}
shift = -1023;
} else {
/* take the significant bit off mantissa */
fnorm = fnorm - 1.0;
}
/* calculate the integer form of the significand */
/* hold it in a double for now */
significand = fnorm * ((1LL << significandbits) + 0.5f);
/* get the biased exponent */
exp = shift + ((1 << (expbits - 1)) - 1); /* shift + bias */
/* put the data into two longs */
hibits = static_cast<long>(significand / 4294967296); /* 0x100000000 */
hilong = (sign << 31) | (exp << (31 - expbits)) | hibits;
lowlong = static_cast<unsigned long>(significand - hibits * 4294967296);
}
destination[0] = lowlong & 0xFF;
destination[1] = (lowlong >> 8) & 0xFF;
destination[2] = (lowlong >> 16) & 0xFF;
destination[3] = (lowlong >> 24) & 0xFF;
destination[4] = hilong & 0xFF;
destination[5] = (hilong >> 8) & 0xFF;
destination[6] = (hilong >> 16) & 0xFF;
destination[7] = (hilong >> 24) & 0xFF;
}
现在,您可以为写入144字节缓冲区的A
编写自己的序列化程序:
void serializeA(A& a, uint8_t destination[144]) {
uint8_t* out = destination;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
serializeIeee754(a.array[i][j], out);
out += 8;
}
}
serializeIeee754(a.x, out);
out += 8;
serializeIeee754(a.y, out);
}
然后将该缓冲区提供给哈希函数。
问题内容: 我想计算的不是字符串,而是整个数据结构的md5哈希。我了解执行此操作的方法的机制(调度值的类型,规范化字典键顺序和其他随机性,递归为子值等)。但这似乎是一种通常有用的操作,所以令我惊讶的是我需要自己动手操作。 Python中有一些更简单的方法来实现这一目标吗? 更新:建议使用酸洗,这是一个好主意,但是酸洗不能规范化字典的键顺序: 问题答案: bencode对字典进行排序,因此: 印刷品
哈希表(Hash Table,也叫散列表),是根据关键码值 (Key-Value) 而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表的实现主要需要解决两个问题,哈希函数和冲突解决。 哈希函数 哈希函数也叫散列函数,它对不同的输出值得到一个固定长度的消息摘要。理想的哈希函数对于不同的输入应该产生不同的结构,同时散列结果应当具有同一性(输出值尽
哈希表也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术核心就是在内存中维护着一张巨大的哈希表。 学过Java对这个应该很熟悉,Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap 、 Hashtable 、 LinkedHashMap 和 TreeMap ,类继承关系如下图所示: HashMap是Java程序员
汇编语言是直面计算机的编程语言,因此理解计算机结构是掌握汇编语言的前提。当前流行的计算机基本采用的是冯·诺伊曼计算机体系结构(在某些特殊领域还有哈佛体系架构)。冯·诺依曼结构也称为普林斯顿结构,采用的是一种将程序指令和数据存储在一起的存储结构。冯·诺伊曼计算机中的指令和数据存储器其实指的是计算机中的内存,然后在配合CPU处理器就组成了一个最简单的计算机了。 汇编语言其实是一种非常简单的编程语言,因
我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli
我刚刚讨论了散列码的概念,遇到了一行: