crypto: rewrite HexDecode without snprintf
authorRoman Shtylman <shtylman@gmail.com>
Thu, 1 Dec 2011 05:41:06 +0000 (00:41 -0500)
committerBen Noordhuis <info@bnoordhuis.nl>
Fri, 16 Dec 2011 13:35:15 +0000 (14:35 +0100)
No need to use snprintf to create a hex string. It creates
more overhead than is needed. This new version is much faster.

src/node_crypto.cc

index d96b4d1..9f73df3 100644 (file)
@@ -1699,9 +1699,20 @@ static void HexEncode(unsigned char *md_value,
                       int* md_hex_len) {
   *md_hex_len = (2*(md_len));
   *md_hexdigest = new char[*md_hex_len + 1];
-  for (int i = 0; i < md_len; i++) {
-    snprintf((char *)(*md_hexdigest + (i*2)), 3, "%02x",  md_value[i]);
+
+  char* buff = *md_hexdigest;
+  const int len = *md_hex_len;
+  for (int i = 0; i < len; i += 2) {
+    // nibble nibble
+    const int index = i / 2;
+    const char msb = (md_value[index] >> 4) & 0x0f;
+    const char lsb = md_value[index] & 0x0f;
+
+    buff[i] = (msb < 10) ? msb + '0' : (msb - 10) + 'a';
+    buff[i + 1] = (lsb < 10) ? lsb + '0' : (lsb - 10) + 'a';
   }
+  // null terminator
+  buff[*md_hex_len] = '\0';
 }
 
 #define hex2i(c) ((c) <= '9' ? ((c) - '0') : (c) <= 'Z' ? ((c) - 'A' + 10) \