从文件内容生成 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

瞧!没有什么神秘的!