我有以下代码来计算输入的sha_256,我想知道如何知道每次CC_SHA256_Update迭代的最佳数据块大小。是常量值还是依赖于系统环境的变量?
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;
答案 0 :(得分:3)
我认为只有不同尺寸的测试才能明确,但64kB(分配粒度)的倍数可能是首选。
但为了获得最佳效果,您可以考虑直接在file
上使用memory mapping。这将消除将所有数据从内核模式(OS磁盘缓存)复制到用户模式的需要。您将直接访问操作系统缓存,您可能只需要调用CC_SHA256_Update()
一次。