Skip to content

Instantly share code, notes, and snippets.

@9468305
Last active November 22, 2015 10:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 9468305/20068a1af16910361278 to your computer and use it in GitHub Desktop.
Save 9468305/20068a1af16910361278 to your computer and use it in GitHub Desktop.
一个计算文件blake2s信息摘要的并行算法实现
/* 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