"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Christian Weisgerber <naddy@mips.inka.de>
Subject:
Re: provide functions to parse/serialize different hashes
To:
Omar Polo <op@omarpolo.com>
Cc:
gameoftrees@openbsd.org
Date:
Thu, 23 Feb 2023 20:12:15 +0100

Download raw body.

Thread
Omar Polo:

> +static char *
> +digest_to_str(const uint8_t *digest, int len, char *buf)
>  {
>  	char *p = buf;
>  	char hex[3];
>  	int i;
>  
> -	if (size < SHA1_DIGEST_STRING_LENGTH)
> -		return NULL;
> -
> -	for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
> +	for (i = 0; i < len; i++) {
>  		snprintf(hex, sizeof(hex), "%.2x", digest[i]);
>  		p[0] = hex[0];
>  		p[1] = hex[1];

Calling snprintf() 20 or soon 32 times to format a hash seems
excessive.  How about doing this the very old-fashioned way?

diff /home/naddy/got
commit - 87a3ab84d3eb87b790e3d34aeec2c344a8d7375b
path + /home/naddy/got
blob - 51a9a0ca1ab1e8d6bc5e9f6722d0595f2a3b5fe7
file + lib/hash.c
--- lib/hash.c
+++ lib/hash.c
@@ -71,17 +71,15 @@ digest_to_str(const uint8_t *digest, int len, char *bu
 static char *
 digest_to_str(const uint8_t *digest, int len, char *buf)
 {
+	const char hex[] = "0123456789abcdef";
 	char *p = buf;
-	char hex[3];
 	int i;
 
 	for (i = 0; i < len; i++) {
-		snprintf(hex, sizeof(hex), "%.2x", digest[i]);
-		p[0] = hex[0];
-		p[1] = hex[1];
-		p += 2;
+		*p++ = hex[digest[i] >> 4];
+		*p++ = hex[digest[i] & 0xf];
 	}
-	p[0] = '\0';
+	*p = '\0';
 
 	return buf;
 }
-- 
Christian "naddy" Weisgerber                          naddy@mips.inka.de