在下面的C ++代码中,SHA1应该返回20 length hash个值。
大多数情况下,id
长度为20(这是正确的)。但有时它是6或4.不知道为什么。请帮忙。
#include <openssl/sha.h>
#include <limit.h>
#include <other common libraries>
void calc_id(char * ip, unsigned short port, unsigned char *id)
{
char data[256];
int len;
//format print
len = snprintf(data, 256,"%s%u", ip, port);
cout<<"length is :: "<<len<<endl;
cout<<"data is ::" << data<<endl;
//id is just the SHA1 of the ip and port string
SHA1((unsigned char *) data, len, (unsigned char *) id);
cout << "SHA1 hash is :: " << id << endl;
cout << "length of hash is" << lengthOfU(id) <<endl;
return;
}
int lengthOfU(unsigned char * str)
{
int i = 0;
while (*(str++))
{
i++;
if (i == INT_MAX) //INT_MAX from limit.h
return -1;
}
return i;
}
ip就像127.0.0.1
端口就像6671
我正在尝试计算ip port
对的唯一ID。 SHA1哈希将是一些“特殊”字符,但长度应为20.
答案 0 :(得分:1)
与其他哈希一样,SHA1是二进制字节序列。不要在其上使用strlen
(也不要手写自己的strlen
)。如果那里有\0
你将会被截断;如果那里有不一个\0
,那么你将开始阅读未分配的内存。
如果您想将它作为字符串,则需要将其转换为十六进制;那么它的长度是40。
答案 1 :(得分:0)
因为id不是字符串,所以它是20个字节的集合,而零是其中一个字节的完全有效值。
在调用 lengthOfU
之前,您需要将其变为十六进制字符串