test-sha1: test hashing large buffer
authorJunio C Hamano <junkio@cox.net>
Sat, 24 Jun 2006 09:59:20 +0000 (02:59 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 24 Jun 2006 09:59:20 +0000 (02:59 -0700)
test to hash a large buffer in one go is more important than
hashing large amount of data in small fixed chunks.

Signed-off-by: Junio C Hamano <junkio@cox.net>
test-sha1.c
test-sha1.sh

index 2efc315ee3cfa4cfc7c5d191d9b673d727cc40ea..78d7e983a7a05ba0652132425a66477ef5773304 100644 (file)
@@ -4,21 +4,44 @@ int main(int ac, char **av)
 {
        SHA_CTX ctx;
        unsigned char sha1[20];
+       unsigned bufsz = 8192;
+       char *buffer;
+
+       if (ac == 2)
+               bufsz = strtoul(av[1], NULL, 10) * 1024 * 1024;
+
+       if (!bufsz)
+               bufsz = 8192;
+
+       while ((buffer = malloc(bufsz)) == NULL) {
+               fprintf(stderr, "bufsz %u is too big, halving...\n", bufsz);
+               bufsz /= 2;
+               if (bufsz < 1024)
+                       die("OOPS");
+       }
 
        SHA1_Init(&ctx);
 
        while (1) {
-               ssize_t sz;
-               char buffer[8192];
-               sz = xread(0, buffer, sizeof(buffer));
-               if (sz == 0)
+               ssize_t sz, this_sz;
+               char *cp = buffer;
+               unsigned room = bufsz;
+               this_sz = 0;
+               while (room) {
+                       sz = xread(0, cp, room);
+                       if (sz == 0)
+                               break;
+                       if (sz < 0)
+                               die("test-sha1: %s", strerror(errno));
+                       this_sz += sz;
+                       cp += sz;
+                       room -= sz;
+               }
+               if (this_sz == 0)
                        break;
-               if (sz < 0)
-                       die("test-sha1: %s", strerror(errno));
-               SHA1_Update(&ctx, buffer, sz);
+               SHA1_Update(&ctx, buffer, this_sz);
        }
        SHA1_Final(sha1, &ctx);
        puts(sha1_to_hex(sha1));
        exit(0);
 }
-
index 01bbb5782e05ff4da9be9e0b5b308b59e5f7c7e7..640856af5a6712a05b2530ad0951d84e631d0ec1 100755 (executable)
@@ -11,7 +11,7 @@ do
                        test -z "$pfx" || echo "$pfx"
                        dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
                        tr '[\0]' '[g]'
-               } | ./test-sha1
+               } | ./test-sha1 $cnt
        `
        if test "$expect" = "$actual"
        then