C++ 如何访问数百万位进行散列

C++ 如何访问数百万位进行散列,c++,c,binary,char,md5,C++,C,Binary,Char,Md5,我正在对一个可执行文件进行MD5哈希运算。我使用python脚本将二进制文件从可执行文件读入文本文件,但如果我将这个构造文件读入C程序,我将处理MBs的数据,因为1和0被视为chars,每1位数字取8位。是否可以将这些数据以单个位的形式读入?如果我制作了一个10MB的数组来保存二进制转换长度和散列填充所需的所有字符,那么程序的性能会有多差?如果这是不可想象的,有更好的方法来操纵数据吗? < P>自从你标记了问题C和C++,我就去C. 是否可以将这些数据以单个位的形式读入 是的,只需从文件中一次读

我正在对一个可执行文件进行MD5哈希运算。我使用python脚本将二进制文件从可执行文件读入文本文件,但如果我将这个构造文件读入C程序,我将处理MBs的数据,因为1和0被视为
char
s,每1位数字取8位。是否可以将这些数据以单个位的形式读入?如果我制作了一个10MB的数组来保存二进制转换长度和散列填充所需的所有字符,那么程序的性能会有多差?如果这是不可想象的,有更好的方法来操纵数据吗?

< P>自从你标记了问题C和C++,我就去C.</P> 是否可以将这些数据以单个位的形式读入

是的,只需从文件中一次读取8个字节,并将这些
1
s和
0
s连接起来,即可生成一个新字节。您不需要为此制作10MB阵列

首先,从文件中读取8个字节。读取的
char
值将转换为整数值(
0
1
),然后进行位移位以生成新字节

unsigned char bits[8];
while (fread(bits, 1, 8, file) == 8) {
    for (unsigned int i = 0; i < 8; i++) {
        bits[i] -= '0';
    }

    char byte = (bits[0] << 7) | (bits[1] << 6) |
                (bits[2] << 5) | (bits[3] << 4) |
                (bits[4] << 3) | (bits[5] << 2) |
                (bits[6] << 1) | (bits[7]     );

    /* update MD5 Hash here */
}
无符号字符位[8];
while(fread(位,1,8,文件)==8){
for(无符号整数i=0;i<8;i++){
位[i]-=“0”;
}

char byte=(bits[0]首先,不要使用MD5——在今天这个时代使用它是没有合理理由的。这是我正在做的研究的第一步。最重要的是让我熟悉散列。之后我们将切换到一个更好的散列算法。这真的没有意义——基本上你所做的一切(或者你提到的所有内容)是散列。所以基本上,你说的是做一些事情,然后完全扔掉它,从第一天开始重新开始。如果你像你描述的那样,从1和0作为字符的字符串开始,这是双重事实。@Dolphiniac你是说你正在读取的文件每一位使用一个字节吗?就像文本文件一样只有字符
0
1
?我个人喜欢用字节存储我的位。说我疯了吧。我个人喜欢(8*N)个字符,其中N是底层哈希算法的块大小。例如,SHA-1有512位块大小,SHA-2的(224256)同样是512位,SHA-2(384/512)是1024位,等等。这是一个非常好的主意。在这种情况下,他必须在更新哈希之前读取64字节。这样,他就不需要将输入处理为512位块的开销。他不需要这样做,但任何自尊的哈希算法实现都只需要在数据上等待,直到块大小满或终结器例如,对于SHA-1,读取8*512个字符,将它们转换为字节,然后提交块可能至少有助于减少散列api调用的数量。当然,如果内存合理,那么将其发挥到极致,您可以通过用实际字节填充std::vector的过滤器来流式传输数据,一旦重新处理完位文件后,以单个哈希+最终确定的方式发送向量。是的,这会优化事情,但我在键入答案时更关心内存使用情况:/我可以问一下,如果文件中没有剩余的512字节块,在上面编辑的算法中会发生什么情况吗?另外,EOF会如何影响它?
unsigned char buffer[64];
unsigned char bits[8];
unsigned int index = 0;

while (fread(bits, 1, 8, file) == 8) {
    for (unsigned int i = 0; i < 8; i++) {
        bits[i] -= '0';
    }

    buffer[index++] = (bits[0] << 7) | (bits[1] << 6) |
                      (bits[2] << 5) | (bits[3] << 4) |
                      (bits[4] << 3) | (bits[5] << 2) |
                      (bits[6] << 1) | (bits[7]     );

    if (index == 64) {
        index = 0;
        /* update MD5 hash with 64 byte buffer */
    }
}

/* This sends the remaining data to the MD5 hash function */
/* It's not likely that your file has exactly 512N chars */
if (index != 0) {
    while (index != 64) {
        buffer[index++] = 0;
    }
    /* update MD5 hash with the padded buffer. */
}