从文件内容生成 sha-1
Generating sha-1 from file content
我需要从文件内容生成 SHA-1 代码(例如,不同名称的同一图像会生成相同的代码)。我更愿意使用 openssl,因为 it seems to be the more performant.
this 问题解释了如何从文件内容中获取 SHA-1,但不保证对某些文件有效。
这个问题有任何解决方案(即使使用 openssl 以外的其他库,但性能确实很重要)。
此示例说明如何从文件生成 SHA1 摘要并使用 openssl 以十六进制表示形式显示它:
#include <stdio.h>
#include <openssl/sha.h>
#define MAX_BUF_LEN ( 1024 * 8 )
int sha1( const char * name, unsigned char * out )
{
FILE * pf;
unsigned char buf[ MAX_BUF_LEN ];
SHA_CTX ctxt;
pf = fopen( name, "rb" );
if( !pf )
return -1;
SHA1_Init( &ctxt );
while(1)
{
size_t len;
len = fread( buf, 1, MAX_BUF_LEN, pf );
if( len <= 0 )
break;
SHA1_Update( &ctxt, buf, len );
}
fclose(pf);
SHA1_Final( out, &ctxt );
return 0;
}
void bin2hex( unsigned char * src, int len, char * hex )
{
int i, j;
for( i = 0, j = 0; i < len; i++, j+=2 )
sprintf( &hex[j], "%02x", src[i] );
}
int main( int argc, char * argv[] )
{
unsigned char digest[ SHA_DIGEST_LENGTH ];
char str[ (SHA_DIGEST_LENGTH * 2) + 1 ];
if( sha1( argv[1], digest ) )
{
printf("Error!\n");
return 1;
}
bin2hex( digest, sizeof(digest), str );
printf("SHA1: %s\n", str );
return 0;
}
/* eof */
正在编译:
$ gcc sha1.c -lcrypto -o sha1
测试:
$ cat file.txt
The quick brown fox jumps over the lazy dog
$ ./sha1 file.txt
SHA1: be417768b5c3c5c1d9bcb2e7c119196dd76b5570
$ sha1sum file.txt
be417768b5c3c5c1d9bcb2e7c119196dd76b5570 file.txt
瞧!没有什么神秘的!
我需要从文件内容生成 SHA-1 代码(例如,不同名称的同一图像会生成相同的代码)。我更愿意使用 openssl,因为 it seems to be the more performant.
this 问题解释了如何从文件内容中获取 SHA-1,但不保证对某些文件有效。
这个问题有任何解决方案(即使使用 openssl 以外的其他库,但性能确实很重要)。
此示例说明如何从文件生成 SHA1 摘要并使用 openssl 以十六进制表示形式显示它:
#include <stdio.h>
#include <openssl/sha.h>
#define MAX_BUF_LEN ( 1024 * 8 )
int sha1( const char * name, unsigned char * out )
{
FILE * pf;
unsigned char buf[ MAX_BUF_LEN ];
SHA_CTX ctxt;
pf = fopen( name, "rb" );
if( !pf )
return -1;
SHA1_Init( &ctxt );
while(1)
{
size_t len;
len = fread( buf, 1, MAX_BUF_LEN, pf );
if( len <= 0 )
break;
SHA1_Update( &ctxt, buf, len );
}
fclose(pf);
SHA1_Final( out, &ctxt );
return 0;
}
void bin2hex( unsigned char * src, int len, char * hex )
{
int i, j;
for( i = 0, j = 0; i < len; i++, j+=2 )
sprintf( &hex[j], "%02x", src[i] );
}
int main( int argc, char * argv[] )
{
unsigned char digest[ SHA_DIGEST_LENGTH ];
char str[ (SHA_DIGEST_LENGTH * 2) + 1 ];
if( sha1( argv[1], digest ) )
{
printf("Error!\n");
return 1;
}
bin2hex( digest, sizeof(digest), str );
printf("SHA1: %s\n", str );
return 0;
}
/* eof */
正在编译:
$ gcc sha1.c -lcrypto -o sha1
测试:
$ cat file.txt
The quick brown fox jumps over the lazy dog
$ ./sha1 file.txt
SHA1: be417768b5c3c5c1d9bcb2e7c119196dd76b5570
$ sha1sum file.txt
be417768b5c3c5c1d9bcb2e7c119196dd76b5570 file.txt
瞧!没有什么神秘的!