0
#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

私の理解では、( を待機するEOF) while ループを保持し、10 (0x0a) を受け取った後にハッシュ計算と出力を行います。print mhash をリセットする必要がありますよね?私は C にはまったく興味がありませんが、高速なプログラムが必要なので、C で実行したいと考えています。既にポインターと整数の比較に失敗しています ;-) 誰か助けてもらえますか?

4

2 に答える 2

1

やりました;-)

#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);
 }
于 2016-05-09T10:25:24.423 に答える
1

これは 1 つの小さな注意点を除いて機能します。hash返されるバッファーmhash_endは動的に割り当てられたバッファーであるため、free使い終わったら使用することをお勧めします。

free(hash);

which を使用fgetsすると、最大で 1 行を読み取ることができます。パフォーマンスの観点から、毎回文字を読み取ってハッシュにフィードすることはおそらく最善の方法ではありません。代わりに、行全体を読み取り、ブロックをハッシュ関数にフィードして更新することができます。これを試して:

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);
于 2016-05-09T10:30:59.087 に答える