我正在寻找转换从SHA-256
位哈希生成的以下两个哈希值。
hash1="8bb0cf6eb9b17d0f7d22b456f121257dc1254e1f01665370476383ea776df414" //SHA-256 bit hash of 1234567
hash2="fe68a21fc76bba7b3a3d8e454eca8cd258de68fd08dddf035f23ddbdce6fc049" //SHA-256 bit hash of 7654321
是否可以有xorhash=hash1^hash2
?
xorhash=75d86d717edac774471f3a13bfeba9af99fb26e209bb8c7318405e57b902345d
是输出。
您的帮助将不胜感激。谢谢
答案 0 :(得分:0)
根据您的需要,您有两种选择:
a)将所有内容保留为字符串
在这种情况下,您需要一个“针对每个字符”循环,该循环将源字符从char
转换为整数,进行XOR,然后将结果转换回char
。例如:
for(int i = 0; i < 256/4; i++) {
d1 = hash1[i];
if( (d1 >= '0') && (d1 <= '9') ) {
d1 = d1 - '0';
} else if( ( (d1 >= 'A') && (d1 <= 'F') ) || ( (d1 >= 'a') && (d1 <= 'f') ) ) {
d1 = d1 - 'A' + 10;
} else {
/* Syntax error */
}
d2 = hash2[i];
if( (d2 >= '0') && (d2 <= '9') ) {
d2 = d2 - '0';
} else if( ( (d2 >= 'A') && (d2 <= 'F') ) || ( (d2 >= 'a') && (d2 <= 'f') ) ) {
d2 = d2 - 'A' + 10;
} else {
/* Syntax error */
}
dr = d1 ^ d2;
if(dr < 10) {
dr = dr + '0';
} else {
dr = dr - 10 + 'A';
}
result[i] = dr;
}
b)使用整数
如您所见,字符串速度缓慢且混乱,它们还会浪费RAM(并给缓存带来更多压力,等等)。
如果您改用整数,则C不支持256位整数,因此您需要将其分解为C所支持的内容。例如:
struct myHash {
uint32_t digit[256/32];
}
struct myHash hash1 = { 0x8bb0cf6e, 0xb9b17d0f, 0x7d22b456, 0xf121257d, 0xc1254e1f, 0x01665370, 0x476383ea, 0x776df414 };
在这种情况下,您可以执行以下操作:
for(i = 0; i < 256/32; i++) {
result[i] = hash1[i] ^ hash2[i];
}
请注意,此操作在循环内的工作量明显减少,并且循环的迭代次数也少得多(一次8次迭代执行一次32位,而不是一次64次迭代执行一次4位)。
实际上;编译器可能会将其转换为“无环”代码,如下所示:
result[0] = hash1[0] ^ hash2[0];
result[1] = hash1[1] ^ hash2[1];
result[2] = hash1[2] ^ hash2[2];
result[3] = hash1[3] ^ hash2[3];
result[4] = hash1[4] ^ hash2[4];
result[5] = hash1[5] ^ hash2[5];
result[6] = hash1[6] ^ hash2[6];
result[7] = hash1[7] ^ hash2[7];
..并且(对于某些计算机)它可能会将其转换为SIMD(例如,如果计算机使用AVX2支持256位操作,那么即使C不支持256位整数,这也可能变成3条指令)。