sha1: Add new notmuch_sha1_of_string function
authorCarl Worth <cworth@cworth.org>
Fri, 23 Oct 2009 20:54:53 +0000 (13:54 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 23 Oct 2009 20:54:53 +0000 (13:54 -0700)
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

notmuch-private.h
sha1.c

index 8b317c2d8a3b9b59189de6982330773d6a7ff17e..a56501e98908150fe62ea63d6845e5c650268db3 100644 (file)
@@ -217,15 +217,9 @@ notmuch_parse_date (const char *str, int *tz_offset);
 
 /* sha1.c */
 
-/* Create a hexadecimal string version of the SHA-1 digest 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 *
+notmuch_sha1_of_string (const char *str);
+
 char *
 notmuch_sha1_of_file (const char *filename);
 
diff --git a/sha1.c b/sha1.c
index 152d870ca22b9684a903bf54e43e0d33ff450928..ff4dd164779bbfc74b87aa2ae54d597f02ca9241 100644 (file)
--- a/sha1.c
+++ b/sha1.c
 /* Just some simple interfaces on top of libsha1 so that we can leave
  * 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 *
 notmuch_sha1_of_file (const char *filename)
 {
@@ -34,8 +82,7 @@ notmuch_sha1_of_file (const char *filename)
     size_t bytes_read;
     sha1_ctx sha1;
     unsigned char digest[SHA1_DIGEST_SIZE];
-    char *result, *r;
-    int i;
+    char *result;
 
     file = fopen (filename, "r");
     if (file == NULL)
@@ -59,16 +106,7 @@ notmuch_sha1_of_file (const char *filename)
 
     sha1_end (digest, &sha1);
 
-    result = calloc (SHA1_DIGEST_SIZE * 2 + 1, 1);
-    if (result == NULL)
-       return NULL;
-
-    for (r = result, i = 0;
-        i < SHA1_DIGEST_SIZE;
-        r += 2, i++)
-    {
-       sprintf (r, "%02x", digest[i]);
-    }
+    result = _hex_of_sha1_digest (digest);
 
     fclose (file);