C++ 由六角管柱形成管柱
我试图通过读取文件内容来创建文件的散列,然后使用C++ 由六角管柱形成管柱,c++,openssl,sha1,ofstream,C++,Openssl,Sha1,Ofstream,我试图通过读取文件内容来创建文件的散列,然后使用SHA1对其进行散列,之后我尝试使用此散列值创建一个文件名,但问题只涉及散列字符串的前两个字符。 散列函数 void hash(const std::string& content, std::string& retValue, bool isFile) { SHA_CTX ctx; SHA1_Init(&ctx); SHA1_Update(&ctx, content.c_str(), con
SHA1
对其进行散列,之后我尝试使用此散列值创建一个文件名,但问题只涉及散列字符串的前两个字符。
散列函数
void hash(const std::string& content, std::string& retValue, bool isFile)
{
SHA_CTX ctx;
SHA1_Init(&ctx);
SHA1_Update(&ctx, content.c_str(), content.size());
if (isFile) {
FILE* f = fopen(content.c_str(),"r");
assert(f != NULL);
char buffer[1024]={0};
while(fgets(buffer,1024,f))
SHA1_Update(&ctx,buffer,strlen(buffer));
fclose(f);
}
unsigned char hash[SHA_DIGEST_LENGTH] = {0};
SHA1_Final(hash,&ctx);
retValue.resize(60);
int cnt = 0;
for(int i=0;i<SHA_DIGEST_LENGTH;i++){
char ch[3] = {0};
sprintf(ch,"%02x",hash[i]);
retValue[cnt++] = ch[0];
retValue[cnt++] = ch[1];
retValue[cnt++] = ch[2];
}
std::cout<<retValue<<std::endl;
}
下面是一个略短的版本,它也做了同样的事情:
for(int i=0;i<SHA_DIGEST_LENGTH;i++){
sprintf(retValue + cnt,"%02x",hash[i]);
cnt += 2;
}
for(int i=0;iretValue[cnt++]=ch[2];
这会在每两个十六进制字符后复制'\0'
nul终止符。但是您只希望nul终止符位于字符串的最末尾。负面投票者应该评论他们在这篇文章中发现了什么,所以我不再重复。谢谢you@dxiv好吧,让我试试that@dxiv谢谢你的评论,它解决了我的问题:)
for(int i=0;i<SHA_DIGEST_LENGTH;i++){
sprintf(retValue + cnt,"%02x",hash[i]);
cnt += 2;
}