after discussion with ciruZ, switch mksh from NZAT to NZAAT fully

to get rid of the bias introduced by making the hash never zero

… he also pointed out a memory (heap) usage optimisation… which
may impact code size a bit though as I’d need to pass an additional
argument on hashtable function calls… or, forgo the benefit of not
having to pointer-align the key in the structure, which can be as
much as 3/7 octets per item, heap storage… OTOH the saved space is
4/8 octets per not-allocated item, possibly some code (use of an
multiply-add opcode), but the function call overhead/cost would
possibly be quite a bit… I guess I’ll have to measure…
This commit is contained in:
tg 2012-04-22 21:50:35 +00:00
parent 48da83288d
commit 5204e7cc4f
5 changed files with 13 additions and 22 deletions

View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.532 2012/04/14 16:07:44 tg Exp $
# $MirOS: src/bin/mksh/check.t,v 1.533 2012/04/22 21:50:29 tg Exp $
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
@ -29,7 +29,7 @@
# http://www.freebsd.org/cgi/cvsweb.cgi/src/tools/regression/bin/test/regress.sh?rev=HEAD
expected-stdout:
@(#)MIRBSD KSH R40 2012/04/14
@(#)MIRBSD KSH R40 2012/04/22
description:
Check version of shell.
stdin:
@ -7089,7 +7089,7 @@ stdin:
print ${foo@#123} ${bar@#456} ${baz@#789} .
print ${foo@#bla} ${bar@#bar} ${baz@#OPTIND} .
expected-stdout:
D50219A0 20E5DB5B 00000001 .
D50219A0 20E5DB5B 00000000 .
554A1C76 004A212E CB209562 .
6B21CF91 20E5DB5B 124EA49D .
---

4
eval.c
View File

@ -23,7 +23,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.116 2012/04/06 14:07:52 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.117 2012/04/22 21:50:31 tg Exp $");
/*
* string expansion
@ -392,7 +392,7 @@ expand(const char *cp, /* input word */
h = seed;
NZATUpdateString(h,
str_val(st->var));
NZATFinish(h);
NZAATFinish(h);
x.str = shf_smprintf("%08X",
(unsigned int)h);
break;

6
mksh.1
View File

@ -1,4 +1,4 @@
.\" $MirOS: src/bin/mksh/mksh.1,v 1.284 2012/04/14 12:51:34 tg Exp $
.\" $MirOS: src/bin/mksh/mksh.1,v 1.285 2012/04/22 21:50:32 tg Exp $
.\" $OpenBSD: ksh.1,v 1.141 2011/09/03 22:59:08 jmc Exp $
.\"-
.\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
@ -74,7 +74,7 @@
.\" with -mandoc, it might implement .Mx itself, but we want to
.\" use our own definition. And .Dd must come *first*, always.
.\"
.Dd $Mdocdate: April 14 2012 $
.Dd $Mdocdate: April 22 2012 $
.\"
.\" Check which macro package we use, and do other -mdoc setup.
.\"
@ -1626,7 +1626,7 @@ The internal hash of the expansion of
.Ar name ,
with an optional (defaulting to zero)
.Ar seed .
At the moment, this is NZAT (a never-zero 32-bit hash based on
At the moment, this is NZAAT (a 32-bit hash based on
Bob Jenkins' one-at-a-time hash), but this is not set.
This is the hash the shell uses internally for its associative arrays.
.El

15
sh.h
View File

@ -152,9 +152,9 @@
#endif
#ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.549 2012/04/14 16:07:48 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.550 2012/04/22 21:50:33 tg Exp $");
#endif
#define MKSH_VERSION "R40 2012/04/14"
#define MKSH_VERSION "R40 2012/04/22"
/* arithmetic types: C implementation */
#if !HAVE_CAN_INTTYPES
@ -1491,7 +1491,7 @@ EXTERN struct timeval j_usrtime, j_systime;
} while (/* CONSTCOND */ 0)
/* NZAT/NZAAT hashes based on Bob Jenkins' one-at-a-time hash */
/* NZAAT hash based on Bob Jenkins' one-at-a-time hash */
/* From: src/kern/include/nzat.h,v 1.2 2011/07/18 00:35:40 tg Exp $ */
@ -1524,15 +1524,6 @@ EXTERN struct timeval j_usrtime, j_systime;
NZATUpdateByte((h), NZATUpdateString_c); \
} while (/* CONSTCOND */ 0)
/* not zero after termination */
#define NZATFinish(h) do { \
if ((h) == 0) \
++(h); \
else \
NZAATFinish(h); \
} while (/* CONSTCOND */ 0)
/* NULs zählen an allen Teilen */
#define NZAATFinish(h) do { \
(h) += (h) << 10; \
(h) ^= (h) >> 6; \

4
var.c
View File

@ -27,7 +27,7 @@
#include <sys/sysctl.h>
#endif
__RCSID("$MirOS: src/bin/mksh/var.c,v 1.146 2012/04/14 14:35:13 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/var.c,v 1.147 2012/04/22 21:50:35 tg Exp $");
/*-
* Variables
@ -1471,7 +1471,7 @@ hash(const void *s)
NZATInit(h);
NZATUpdateString(h, s);
NZATFinish(h);
NZAATFinish(h);
return (h);
}