Last active
November 22, 2015 10:31
-
-
Save 9468305/20068a1af16910361278 to your computer and use it in GitHub Desktop.
一个计算文件blake2s信息摘要的并行算法实现
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* A really fast parallel blake2s hash for big file. | |
* | |
* Usage: Add this into blake2sp-ref.c | |
*/ | |
#include <sys/stat.h> | |
int blake2sp_file( const char *filename, uint8_t *out, uint8_t outlen ) | |
{ | |
memset(out, 0, outlen); | |
static const size_t buf_len = 8*1024; | |
struct stat st; | |
if(stat(filename, &st) != 0 || !S_ISREG(st.st_mode)) return -1; // file not exist or not regular file | |
if(st.st_size == 0) return 0; // empty file | |
const size_t parallel_size = (st.st_size + PARALLELISM_DEGREE - 1) / PARALLELISM_DEGREE; | |
uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; | |
blake2s_state S[PARALLELISM_DEGREE][1]; | |
blake2s_state FS[1]; | |
for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) | |
if( blake2sp_init_leaf( S[i], outlen, 0, i ) < 0 ) return -1; | |
S[PARALLELISM_DEGREE - 1]->last_node = 1; // mark last node | |
#if defined(_OPENMP) | |
#pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) | |
#else | |
for( size_t id__ = 0; id__ < PARALLELISM_DEGREE; ++id__ ) | |
#endif | |
{ | |
#if defined(_OPENMP) | |
size_t id__ = omp_get_thread_num(); | |
#endif | |
FILE *file = fopen(filename, "rb"); | |
if(file) | |
{ | |
size_t read_pos = id__ * parallel_size; | |
size_t read_len = (id__ == PARALLELISM_DEGREE-1) ? (st.st_size - read_pos) : (parallel_size); | |
uint8_t *buf = malloc(buf_len); | |
fseek(file, read_pos, SEEK_SET); | |
while( read_len >= buf_len ) | |
{ | |
fread(buf, buf_len, 1, file); | |
blake2s_update( S[id__], buf, buf_len); | |
read_len -= buf_len; | |
} | |
if(read_len > 0) | |
{ | |
fread(buf, read_len, 1, file); | |
blake2s_update( S[id__], buf, read_len); | |
} | |
blake2s_final( S[id__], hash[id__], BLAKE2S_OUTBYTES ); | |
free(buf); | |
fclose(file); | |
} | |
} | |
if( blake2sp_init_root( FS, outlen, 0 ) < 0 ) return -1; | |
FS->last_node = 1; | |
for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) | |
blake2s_update( FS, hash[i], BLAKE2S_OUTBYTES ); | |
return blake2s_final( FS, out, outlen ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment