mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
sha1: Add new notmuch_sha1_of_string function
We'll be using this for storing really long terms in the database and when we just need to look them up, (and never read back the original data directly from the database). For example, storing arbitrarily long directory paths in the database along with mtime timestamps. Note that if we did want to store arbitrarily long terms and also be able to read them back, the Xapian folks recommending splitting the term off with multiple prefixes. See the note near the end of this page: http://trac.xapian.org/wiki/FAQ/UniqueIds
This commit is contained in:
parent
c9fbe6b58b
commit
6b228e4509
2 changed files with 53 additions and 21 deletions
|
@ -217,15 +217,9 @@ notmuch_parse_date (const char *str, int *tz_offset);
|
||||||
|
|
||||||
/* sha1.c */
|
/* sha1.c */
|
||||||
|
|
||||||
/* Create a hexadecimal string version of the SHA-1 digest of the
|
char *
|
||||||
* named file.
|
notmuch_sha1_of_string (const char *str);
|
||||||
*
|
|
||||||
* This function returns a newly allocated string which the caller
|
|
||||||
* should free() when finished.
|
|
||||||
*
|
|
||||||
* If any error occurs while reading the file, (permission denied,
|
|
||||||
* file not found, etc.), this function returns NULL.
|
|
||||||
*/
|
|
||||||
char *
|
char *
|
||||||
notmuch_sha1_of_file (const char *filename);
|
notmuch_sha1_of_file (const char *filename);
|
||||||
|
|
||||||
|
|
62
sha1.c
62
sha1.c
|
@ -25,6 +25,54 @@
|
||||||
/* Just some simple interfaces on top of libsha1 so that we can leave
|
/* Just some simple interfaces on top of libsha1 so that we can leave
|
||||||
* libsha1 as untouched as possible. */
|
* libsha1 as untouched as possible. */
|
||||||
|
|
||||||
|
static char *
|
||||||
|
_hex_of_sha1_digest (const unsigned char digest[SHA1_DIGEST_SIZE])
|
||||||
|
{
|
||||||
|
char *result, *r;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
result = xcalloc (SHA1_DIGEST_SIZE * 2 + 1, 1);
|
||||||
|
|
||||||
|
for (r = result, i = 0;
|
||||||
|
i < SHA1_DIGEST_SIZE;
|
||||||
|
r += 2, i++)
|
||||||
|
{
|
||||||
|
sprintf (r, "%02x", digest[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a hexadcimal string version of the SHA-1 digest of 'str'
|
||||||
|
* (including its null terminating character).
|
||||||
|
*
|
||||||
|
* This function returns a newly allocated string which the caller
|
||||||
|
* should free() when finished.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
notmuch_sha1_of_string (const char *str)
|
||||||
|
{
|
||||||
|
sha1_ctx sha1;
|
||||||
|
unsigned char digest[SHA1_DIGEST_SIZE];
|
||||||
|
|
||||||
|
sha1_begin (&sha1);
|
||||||
|
|
||||||
|
sha1_hash ((unsigned char *) str, strlen (str) + 1, &sha1);
|
||||||
|
|
||||||
|
sha1_end (digest, &sha1);
|
||||||
|
|
||||||
|
return _hex_of_sha1_digest (digest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a hexadecimal string version of the SHA-1 digest of the
|
||||||
|
* contents of the named file.
|
||||||
|
*
|
||||||
|
* This function returns a newly allocated string which the caller
|
||||||
|
* should free() when finished.
|
||||||
|
*
|
||||||
|
* If any error occurs while reading the file, (permission denied,
|
||||||
|
* file not found, etc.), this function returns NULL.
|
||||||
|
*/
|
||||||
char *
|
char *
|
||||||
notmuch_sha1_of_file (const char *filename)
|
notmuch_sha1_of_file (const char *filename)
|
||||||
{
|
{
|
||||||
|
@ -34,8 +82,7 @@ notmuch_sha1_of_file (const char *filename)
|
||||||
size_t bytes_read;
|
size_t bytes_read;
|
||||||
sha1_ctx sha1;
|
sha1_ctx sha1;
|
||||||
unsigned char digest[SHA1_DIGEST_SIZE];
|
unsigned char digest[SHA1_DIGEST_SIZE];
|
||||||
char *result, *r;
|
char *result;
|
||||||
int i;
|
|
||||||
|
|
||||||
file = fopen (filename, "r");
|
file = fopen (filename, "r");
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
|
@ -59,16 +106,7 @@ notmuch_sha1_of_file (const char *filename)
|
||||||
|
|
||||||
sha1_end (digest, &sha1);
|
sha1_end (digest, &sha1);
|
||||||
|
|
||||||
result = calloc (SHA1_DIGEST_SIZE * 2 + 1, 1);
|
result = _hex_of_sha1_digest (digest);
|
||||||
if (result == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (r = result, i = 0;
|
|
||||||
i < SHA1_DIGEST_SIZE;
|
|
||||||
r += 2, i++)
|
|
||||||
{
|
|
||||||
sprintf (r, "%02x", digest[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose (file);
|
fclose (file);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue