我有下面的代码来计算输入的shau256,我想知道如何知道CC-SHA256更新的每次迭代的最佳数据块大小。它是常量还是依赖于系统环境的变量?

 CC_SHA256_CTX sha256;
 CC_SHA256_Init(&sha256);

 const long bufSize = 32768; //how can i find the optimized size ?
 char* buffer = (char *) malloc(bufSize);

 int bytesRead = 0;
 if(!buffer) {
     return -1;
 }

 while((bytesRead = (int) fread(buffer, 1, bufSize, file))) {
     CC_SHA256_Update(&sha256, buffer, bytesRead);
 }

编辑:我尝试了下面所选答案中描述的不同方法,并使用mmap(而不是malloc+fread)获取数据。不幸的是,id没有提高运行时效率(略有增加)
int fsize(const char *filename) {
    struct stat st;
    if (stat(filename, &st) == 0)
        return st.st_size;
    return -1;
}

int fd = open(path, O_RDONLY);

int sz = fsize(path);
char * buffer = mmap((caddr_t)0, sz, PROT_READ  , MAP_SHARED, fd, 0);

CC_SHA256_CTX sha256;
CC_SHA256_Init(&sha256);

CC_SHA256_Update(&sha256, buffer, sz);

CC_SHA256_Final(output, &sha256);

close(fd);
return 0;

最佳答案

我认为只有使用不同大小的测试才能说明这一点,但是64kB(分配粒度)的倍数可能是首选。
但为了获得最佳性能,可以考虑直接在file上使用memory mapping。这样就无需将所有数据从内核模式(操作系统磁盘缓存)复制到用户模式。您将直接访问操作系统缓存,并且可能只需要调用一次CC_SHA256_Update()

关于c - 针对CC_SHA256_Update优化了批量读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34592829/

10-11 21:35