#include <mhash.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
 {
        int i;
        MHASH td;
        unsigned char buffer;
        unsigned char *hash;

        td = mhash_init(MHASH_WHIRLPOOL);

        if (td == MHASH_FAILED) exit(1);

        while (fread(&buffer, 1, 1, stdin) == 1) {
             mhash(td, &buffer, 1);
        }

        hash = mhash_end(td);

        for (i = 0; i < mhash_get_block_size(MHASH_WHIRLPOOL); i++) {
            printf("%.2x", hash[i]);
        }
        printf("\n");

        exit(0);
 }

嗨,我有上面的mhash示例页面的代码。我需要更改它,所以它将继续从stdin读取数据,并逐行计算哈希值,而不是等待EOF
cat textfile | whirlpool_line_hash

我的理解是,我保留while循环(它等待EOF),并在收到10(0x0a)之后进行散列计算和打印。打印后需要重新设置mhash,对吗?
我根本不喜欢C语言,但我需要一个快速的程序,所以我想用C语言来完成。我已经无法将指针与整数进行比较;-)
有人能帮忙吗?

最佳答案

它的工作原理除了一个小小的警告,由hash返回的mhash_end缓冲区是动态分配的缓冲区,因此当您使用它时最好free它:

free(hash);

您可以使用fgets来读取最多一行。就性能而言,每次读取并将一个字符馈入hash可能不是最好的做法,相反,您可以读取整行并将块馈入hash函数进行更新。试试这个:
char line[4096];
int len;
while (fgets(line, sizeof line, stdin) != NULL) { // read a line each time
    len = strlen(line);
    char *p = strrchr(line, '\n');
    if (p != NULL)
        mhash(td, line, len - 1);  // strip the new line
    else
        mhash(td, line, len);
}

hash = mhash_end(td);
for (i = 0; i < mhash_get_block_size(MHASH_WHIRLPOOL); i++) {
    printf("%.2x", hash[i]);
}
free(hash);

10-08 14:26