Изменение кода AC для работы построчно
#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. Я уже не могу сравнить указатель с целым числом;-) Может кто-нибудь помочь, пожалуйста?
2 ответа
Это работает за исключением одного маленького предостережения, hash
буфер возвращается mhash_end
динамически распределяемый буфер, поэтому лучше free
это когда вы закончите, используя его:
free(hash);
Ты можешь использовать fgets
который будет читать не более одной строки. С точки зрения производительности, чтение и передача в хэш-символ каждый раз, вероятно, не лучшая вещь, вместо этого вы можете прочитать всю строку и передать блок в хэш-функцию для обновления. Попробуй это:
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);
Сделал это;-)
#include <mhash.h> //mhash
#include <stdio.h>
#include <stdlib.h> //exit
#include <unistd.h> //getopt
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) { // read from stdin until receive EOF
if ( buffer != '\n' ) { mhash(td, &buffer, 1); } //dont calculate line break
if ( buffer == '\n' ) { //received line break
hash = mhash_end(td);
for (i = 0; i < mhash_get_block_size(MHASH_WHIRLPOOL); i++) { printf("%.2x", hash[i]); }
printf("\n");
td = mhash_init(MHASH_WHIRLPOOL);
}
}
exit(0);
}