Module Name:    src
Committed By:   joerg
Date:           Mon Jul 20 17:03:38 UTC 2009

Modified Files:
        src/distrib/sets/lists/base: md.amd64 md.sparc64 shl.mi
        src/distrib/sets/lists/comp: mi
        src/distrib/sets/lists/tests: mi
        src/etc/mtree: NetBSD.dist
        src/include: stdlib.h
        src/lib/libc: shlib_version
        src/lib/libc/stdlib: Makefile.inc
        src/tests: Makefile
Added Files:
        src/lib/libc/stdlib: mi_vector_hash.3 mi_vector_hash.c
        src/tests/lib: Atffile Makefile
        src/tests/lib/libc: Atffile Makefile
        src/tests/lib/libc/stdlib: Atffile Makefile t_mi_vector_hash.c

Log Message:
Add a fast, platform independent hash function to libc.
The algorithm used is the Jenkins hash.  The name (mi_vector_hash)
reflects the nature of the hash function.
Add glue for libc ATF tests and include a test case to make sure that
(mis)alignment and endianess are handled correctly.

Bump libc minor to 169.


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/distrib/sets/lists/base/md.amd64
cvs rdiff -u -r1.52 -r1.53 src/distrib/sets/lists/base/md.sparc64
cvs rdiff -u -r1.480 -r1.481 src/distrib/sets/lists/base/shl.mi
cvs rdiff -u -r1.1283 -r1.1284 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.43 -r1.44 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.405 -r1.406 src/etc/mtree/NetBSD.dist
cvs rdiff -u -r1.88 -r1.89 src/include/stdlib.h
cvs rdiff -u -r1.212 -r1.213 src/lib/libc/shlib_version
cvs rdiff -u -r1.71 -r1.72 src/lib/libc/stdlib/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/lib/libc/stdlib/mi_vector_hash.3 \
    src/lib/libc/stdlib/mi_vector_hash.c
cvs rdiff -u -r1.15 -r1.16 src/tests/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/lib/Atffile src/tests/lib/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/lib/libc/Atffile src/tests/lib/libc/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/lib/libc/stdlib/Atffile \
    src/tests/lib/libc/stdlib/Makefile \
    src/tests/lib/libc/stdlib/t_mi_vector_hash.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/base/md.amd64
diff -u src/distrib/sets/lists/base/md.amd64:1.58 src/distrib/sets/lists/base/md.amd64:1.59
--- src/distrib/sets/lists/base/md.amd64:1.58	Sun Jul 19 23:38:11 2009
+++ src/distrib/sets/lists/base/md.amd64	Mon Jul 20 17:03:36 2009
@@ -1,4 +1,4 @@
-# $NetBSD: md.amd64,v 1.58 2009/07/19 23:38:11 christos Exp $
+# $NetBSD: md.amd64,v 1.59 2009/07/20 17:03:36 joerg Exp $
 ./dev/lms0					base-obsolete		obsolete
 ./dev/mms0					base-obsolete		obsolete
 ./libexec/ld.elf_so-i386			base-sys-shlib		compat,pic
@@ -64,7 +64,7 @@
 ./usr/lib/i386/libbz2.so.1			base-compat-shlib	compat,pic
 ./usr/lib/i386/libbz2.so.1.1			base-compat-shlib	compat,pic
 ./usr/lib/i386/libc.so.12			base-compat-shlib	compat,pic
-./usr/lib/i386/libc.so.12.168			base-compat-shlib	compat,pic
+./usr/lib/i386/libc.so.12.169			base-compat-shlib	compat,pic
 ./usr/lib/i386/libcom_err.so.6			base-compat-shlib	compat,pic,kerberos
 ./usr/lib/i386/libcom_err.so.6.0		base-compat-shlib	compat,pic,kerberos
 ./usr/lib/i386/libcrypt.so.1			base-compat-shlib	compat,pic

Index: src/distrib/sets/lists/base/md.sparc64
diff -u src/distrib/sets/lists/base/md.sparc64:1.52 src/distrib/sets/lists/base/md.sparc64:1.53
--- src/distrib/sets/lists/base/md.sparc64:1.52	Sun Jul 19 23:38:11 2009
+++ src/distrib/sets/lists/base/md.sparc64	Mon Jul 20 17:03:36 2009
@@ -1,4 +1,4 @@
-# $NetBSD: md.sparc64,v 1.52 2009/07/19 23:38:11 christos Exp $
+# $NetBSD: md.sparc64,v 1.53 2009/07/20 17:03:36 joerg Exp $
 ./libexec/ld.elf_so-sparc			base-sysutil-bin	compat,pic
 ./sbin/edlabel					base-sysutil-root
 ./usr/bin/fdformat				base-util-bin
@@ -63,7 +63,7 @@
 ./usr/lib/sparc/libbz2.so.1			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libbz2.so.1.1			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libc.so.12			base-compat-shlib	compat,pic
-./usr/lib/sparc/libc.so.12.168			base-compat-shlib	compat,pic
+./usr/lib/sparc/libc.so.12.169			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcom_err.so.6			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcom_err.so.6.0		base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcrypt.so.1			base-compat-shlib	compat,pic

Index: src/distrib/sets/lists/base/shl.mi
diff -u src/distrib/sets/lists/base/shl.mi:1.480 src/distrib/sets/lists/base/shl.mi:1.481
--- src/distrib/sets/lists/base/shl.mi:1.480	Sun Jul 19 23:38:11 2009
+++ src/distrib/sets/lists/base/shl.mi	Mon Jul 20 17:03:36 2009
@@ -1,4 +1,4 @@
-# $NetBSD: shl.mi,v 1.480 2009/07/19 23:38:11 christos Exp $
+# $NetBSD: shl.mi,v 1.481 2009/07/20 17:03:36 joerg Exp $
 #
 # Note:	Don't delete entries from here - mark them as "obsolete" instead,
 #	unless otherwise stated below.
@@ -13,7 +13,7 @@
 #
 # Note:	libtermcap and libtermlib are hardlinked and share the same version.
 #
-./lib/libc.so.12.168				base-sys-shlib		dynamicroot
+./lib/libc.so.12.169				base-sys-shlib		dynamicroot
 ./lib/libcrypt.so.1.0				base-sys-shlib		dynamicroot
 ./lib/libcrypto.so.5.2				base-crypto-shlib	crypto,dynamicroot
 ./lib/libdevmapper.so.1.0			base-lvm-shlib		lvm,dynamicroot
@@ -60,7 +60,7 @@
 ./usr/lib/libbluetooth.so.4.1			base-sys-shlib
 ./usr/lib/libbsdmalloc.so.0.0			base-sys-shlib
 ./usr/lib/libbz2.so.1.1				base-sys-shlib
-./usr/lib/libc.so.12.168			base-sys-shlib
+./usr/lib/libc.so.12.169			base-sys-shlib
 ./usr/lib/libcom_err.so.6.0			base-krb5-shlib		kerberos
 ./usr/lib/libcrypt.so.1.0			base-sys-shlib
 ./usr/lib/libcrypto.so.5.1			base-crypto-shlib	crypto

Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.1283 src/distrib/sets/lists/comp/mi:1.1284
--- src/distrib/sets/lists/comp/mi:1.1283	Sun Jul 19 23:38:11 2009
+++ src/distrib/sets/lists/comp/mi	Mon Jul 20 17:03:36 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.1283 2009/07/19 23:38:11 christos Exp $
+#	$NetBSD: mi,v 1.1284 2009/07/20 17:03:36 joerg Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -6734,6 +6734,7 @@
 ./usr/share/man/cat3/menus.0			comp-c-catman		.cat
 ./usr/share/man/cat3/mergesort.0		comp-c-catman		.cat
 ./usr/share/man/cat3/meta.0			comp-c-catman		.cat
+./usr/share/man/cat3/mi_vector_hash.0		comp-c-catman		.cat
 ./usr/share/man/cat3/mkdtemp.0			comp-c-catman		.cat
 ./usr/share/man/cat3/mkstemp.0			comp-c-catman		.cat
 ./usr/share/man/cat3/mktemp.0			comp-c-catman		.cat
@@ -12193,6 +12194,7 @@
 ./usr/share/man/html3/menus.html		comp-c-htmlman		html
 ./usr/share/man/html3/mergesort.html		comp-c-htmlman		html
 ./usr/share/man/html3/meta.html			comp-c-htmlman		html
+./usr/share/man/html3/mi_vector_hash.html	comp-c-htmlman		html
 ./usr/share/man/html3/mkdtemp.html		comp-c-htmlman		html
 ./usr/share/man/html3/mkstemp.html		comp-c-htmlman		html
 ./usr/share/man/html3/mktemp.html		comp-c-htmlman		html
@@ -17640,6 +17642,7 @@
 ./usr/share/man/man3/menus.3			comp-c-man		.man
 ./usr/share/man/man3/mergesort.3		comp-c-man		.man
 ./usr/share/man/man3/meta.3			comp-c-man		.man
+./usr/share/man/man3/mi_vector_hash.3		comp-c-man		.man
 ./usr/share/man/man3/mkdtemp.3			comp-c-man		.man
 ./usr/share/man/man3/mkstemp.3			comp-c-man		.man
 ./usr/share/man/man3/mktemp.3			comp-c-man		.man

Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.43 src/distrib/sets/lists/tests/mi:1.44
--- src/distrib/sets/lists/tests/mi:1.43	Sat May  2 20:08:52 2009
+++ src/distrib/sets/lists/tests/mi	Mon Jul 20 17:03:36 2009
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.43 2009/05/02 20:08:52 pooka Exp $
+# $NetBSD: mi,v 1.44 2009/07/20 17:03:36 joerg Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -132,6 +132,10 @@
 ./usr/libdata/debug/usr/tests/kernel/t_time.debug			tests-kernel-tests	debug
 ./usr/libdata/debug/usr/tests/kernel/t_ucontext.debug			tests-kernel-tests	debug
 ./usr/libdata/debug/usr/tests/kernel/t_writev.debug			tests-kernel-tests	debug
+./usr/libdata/debug/usr/tests/lib					tests-lib-debug
+./usr/libdata/debug/usr/tests/lib/libc					tests-lib-debug
+./usr/libdata/debug/usr/tests/lib/libc/stdlib				tests-lib-debug
+./usr/libdata/debug/usr/tests/lib/libc/stdlib/t_mi_vector_hash.debug	tests-lib-debug	debug
 ./usr/libdata/debug/usr/tests/modules					tests-sys-debug
 ./usr/libdata/debug/usr/tests/modules/t_modctl.debug			tests-sys-debug		debug
 ./usr/libdata/debug/usr/tests/net					tests-net-debug
@@ -836,6 +840,13 @@
 ./usr/tests/kernel/t_ucontext			tests-kernel-tests
 ./usr/tests/kernel/t_umount			tests-kernel-tests
 ./usr/tests/kernel/t_writev			tests-kernel-tests
+./usr/tests/lib					tests-lib-tests
+./usr/tests/lib/Atffile				tests-lib-tests
+./usr/tests/lib/libc				tests-lib-tests
+./usr/tests/lib/libc/Atffile			tests-lib-tests
+./usr/tests/lib/libc/stdlib			tests-lib-tests
+./usr/tests/lib/libc/stdlib/Atffile		tests-lib-tests
+./usr/tests/lib/libc/stdlib/t_mi_vector_hash	tests-lib-tests
 ./usr/tests/modules				tests-sys-tests
 ./usr/tests/modules/Atffile			tests-sys-tests
 ./usr/tests/net					tests-net-tests

Index: src/etc/mtree/NetBSD.dist
diff -u src/etc/mtree/NetBSD.dist:1.405 src/etc/mtree/NetBSD.dist:1.406
--- src/etc/mtree/NetBSD.dist:1.405	Thu Jun 11 05:40:56 2009
+++ src/etc/mtree/NetBSD.dist	Mon Jul 20 17:03:37 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: NetBSD.dist,v 1.405 2009/06/11 05:40:56 mrg Exp $
+#	$NetBSD: NetBSD.dist,v 1.406 2009/07/20 17:03:37 joerg Exp $
 #	@(#)4.4BSD.dist	8.1 (Berkeley) 6/13/93
 
 # Do not customize this file as it may be overwritten on upgrades.
@@ -550,6 +550,9 @@
 ./usr/libdata/debug/usr/tests/kernel/kqueue
 ./usr/libdata/debug/usr/tests/kernel/kqueue/read
 ./usr/libdata/debug/usr/tests/kernel/kqueue/write
+./usr/libdata/debug/usr/tests/lib
+./usr/libdata/debug/usr/tests/lib/libc
+./usr/libdata/debug/usr/tests/lib/libc/stdlib
 ./usr/libdata/debug/usr/tests/modules
 ./usr/libdata/debug/usr/tests/net
 ./usr/libdata/debug/usr/tests/net/sys
@@ -1431,6 +1434,9 @@
 ./usr/tests/kernel/kqueue
 ./usr/tests/kernel/kqueue/read
 ./usr/tests/kernel/kqueue/write
+./usr/tests/lib
+./usr/tests/lib/libc
+./usr/tests/lib/libc/stdlib
 ./usr/tests/modules
 ./usr/tests/net
 ./usr/tests/net/sys

Index: src/include/stdlib.h
diff -u src/include/stdlib.h:1.88 src/include/stdlib.h:1.89
--- src/include/stdlib.h:1.88	Tue Jan 20 20:08:12 2009
+++ src/include/stdlib.h	Mon Jul 20 17:03:37 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: stdlib.h,v 1.88 2009/01/20 20:08:12 drochner Exp $	*/
+/*	$NetBSD: stdlib.h,v 1.89 2009/07/20 17:03:37 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -295,6 +295,9 @@
 int	 sradixsort(const unsigned char **, int, const unsigned char *,
 	    unsigned);
 
+void	 mi_vector_hash(const void * __restrict, size_t, uint32_t,
+	    uint32_t[3]);
+
 void	 setproctitle(const char *, ...)
 	    __attribute__((__format__(__printf__, 1, 2)));
 const char *getprogname(void) __attribute__((const));

Index: src/lib/libc/shlib_version
diff -u src/lib/libc/shlib_version:1.212 src/lib/libc/shlib_version:1.213
--- src/lib/libc/shlib_version:1.212	Tue May 26 08:04:11 2009
+++ src/lib/libc/shlib_version	Mon Jul 20 17:03:37 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: shlib_version,v 1.212 2009/05/26 08:04:11 joerg Exp $
+#	$NetBSD: shlib_version,v 1.213 2009/07/20 17:03:37 joerg Exp $
 #	Remember to update distrib/sets/lists/base/shl.* when changing
 #
 # things we wish to do on next major version bump:
@@ -35,4 +35,4 @@
 #   it's insufficient bitwidth to implement all ctype class.
 #   see isblank's comment in ctype.h.
 major=12
-minor=168
+minor=169

Index: src/lib/libc/stdlib/Makefile.inc
diff -u src/lib/libc/stdlib/Makefile.inc:1.71 src/lib/libc/stdlib/Makefile.inc:1.72
--- src/lib/libc/stdlib/Makefile.inc:1.71	Sun Oct 26 07:43:07 2008
+++ src/lib/libc/stdlib/Makefile.inc	Mon Jul 20 17:03:37 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.71 2008/10/26 07:43:07 mrg Exp $
+#	$NetBSD: Makefile.inc,v 1.72 2009/07/20 17:03:37 joerg Exp $
 #	from: @(#)Makefile.inc	8.3 (Berkeley) 2/4/95
 
 # stdlib sources
@@ -9,7 +9,7 @@
 	bsearch.c drand48.c exit.c \
 	getenv.c getopt.c getopt_long.c getsubopt.c \
 	hcreate.c heapsort.c imaxdiv.c insque.c jrand48.c l64a.c lldiv.c \
-	lcong48.c lrand48.c lsearch.c merge.c mrand48.c \
+	lcong48.c lrand48.c lsearch.c merge.c mi_vector_hash.c mrand48.c \
 	nrand48.c putenv.c qabs.c qdiv.c qsort.c posix_openpt.c pty.c \
 	radixsort.c rand.c rand_r.c random.c remque.c \
 	seed48.c setenv.c srand48.c strsuftoll.c \
@@ -42,7 +42,7 @@
 	hcreate.3 \
 	imaxabs.3 imaxdiv.3 insque.3 \
 	labs.3 ldiv.3 llabs.3 lldiv.3 lsearch.3 \
-	malloc.3 memory.3 \
+	malloc.3 memory.3 mi_vector_hash.3 \
 	posix_memalign.3 posix_openpt.3 ptsname.3 \
 	qabs.3 qdiv.3 qsort.3 \
 	radixsort.3 rand48.3 rand.3 random.3 \

Index: src/tests/Makefile
diff -u src/tests/Makefile:1.15 src/tests/Makefile:1.16
--- src/tests/Makefile:1.15	Sat May  2 16:02:18 2009
+++ src/tests/Makefile	Mon Jul 20 17:03:37 2009
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.15 2009/05/02 16:02:18 pooka Exp $
+# $NetBSD: Makefile,v 1.16 2009/07/20 17:03:37 joerg Exp $
 
 .include <bsd.own.mk>
 
-SUBDIR=	crypto fs games ipf kernel net rump syscall util
+SUBDIR=	crypto fs games ipf kernel lib net rump syscall util
 
 .if ${MACHINE} != "evbppc"
 SUBDIR+= modules

Added files:

Index: src/lib/libc/stdlib/mi_vector_hash.3
diff -u /dev/null src/lib/libc/stdlib/mi_vector_hash.3:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/lib/libc/stdlib/mi_vector_hash.3	Mon Jul 20 17:03:37 2009
@@ -0,0 +1,60 @@
+.\"	$NetBSD: mi_vector_hash.3,v 1.1 2009/07/20 17:03:37 joerg Exp $
+.\"
+.\" Copyright (c) 2009 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Joerg Sonnenberger.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd July 13, 2009
+.Dt MI_VECTOR_HASH 3
+.Os
+.Sh NAME
+.Nm mi_vector_hash
+.Nd fast 32bit hash functions
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdlib.h
+.Ft void
+.Fn mi_vector_hash "const void * restrict key" "size_t len" \
+    "uint32_t seed" "uint32_t hashes[3]"
+.Sh DESCRIPTION
+The
+.Nm
+function computes three 32-bit hash values of the memory area starting at
+.Fa key
+with length
+.Fa len .
+.Pp
+The output is identical on all architectures and only depends on
+.Fa key
+and
+.Fa seed .
+.Sh IMPLEMENTATION NOTES
+An optimised code path is used if
+.Fa key
+is aligned on a 32-bit boundary.
+.Sh AUTHORS
+The hash function has been created by Bob Jenkins.
Index: src/lib/libc/stdlib/mi_vector_hash.c
diff -u /dev/null src/lib/libc/stdlib/mi_vector_hash.c:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/lib/libc/stdlib/mi_vector_hash.c	Mon Jul 20 17:03:37 2009
@@ -0,0 +1,161 @@
+/*	$NetBSD: mi_vector_hash.c,v 1.1 2009/07/20 17:03:37 joerg Exp $	*/
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * See http://burtleburtle.net/bob/hash/doobs.html for the full description
+ * and the original version of the code.  This version differs by exposing
+ * the full internal state and avoiding byte operations in the inner loop
+ * if the key is aligned correctly.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: mi_vector_hash.c,v 1.1 2009/07/20 17:03:37 joerg Exp $");
+
+#include <sys/endian.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define mix(a, b, c) do {		\
+	a -= b; a -= c; a ^= (c >> 13);	\
+	b -= c; b -= a; b ^= (a << 8);	\
+	c -= a; c -= b; c ^= (b >> 13);	\
+	a -= b; a -= c; a ^= (c >> 12);	\
+	b -= c; b -= a; b ^= (a << 16);	\
+	c -= a; c -= b; c ^= (b >> 5);	\
+	a -= b; a -= c; a ^= (c >> 3);	\
+	b -= c; b -= a; b ^= (a << 10);	\
+	c -= a; c -= b; c ^= (b >> 15);	\
+} while (/* CONSTCOND */0)
+
+#define FIXED_SEED	0x9e3779b9	/* Golden ratio, arbitrary constant */
+
+void
+mi_vector_hash(const void * __restrict key, size_t len, uint32_t seed,
+    uint32_t hashes[3])
+{
+	static const uint32_t mask[4] = {
+		0x000000ff, 0x0000ffff, 0x00ffffff, 0xffffffff
+	};
+	uint32_t orig_len, a, b, c;
+	const uint8_t *k;
+
+	orig_len = (uint32_t)len;
+
+	a = b = FIXED_SEED;
+	c = seed;
+
+	if ((uintptr_t)key & 3) {
+		k = key;
+		while (len >= 12) {
+			a += le32dec(k);
+			b += le32dec(k + 4);
+			c += le32dec(k + 8);
+			mix(a, b, c);
+			k += 12;
+			len -= 12;
+		}
+		c += orig_len;
+
+		if (len > 8) {
+			switch (len) {
+			case 11:
+				c += (uint32_t)k[10] << 24;
+				/* FALLTHROUGH */
+			case 10:
+				c += (uint32_t)k[9] << 16;
+				/* FALLTHROUGH */
+			case 9:
+				c += (uint32_t)k[8] << 8;
+				/* FALLTHROUGH */
+			}
+			b += le32dec(k + 4);
+			a += le32dec(k);
+		} else if (len > 4) {
+			switch (len) {
+			case 8:
+				b += (uint32_t)k[7] << 24;
+				/* FALLTHROUGH */
+			case 7:
+				b += (uint32_t)k[6] << 16;
+				/* FALLTHROUGH */
+			case 6:
+				b += (uint32_t)k[5] << 8;
+				/* FALLTHROUGH */
+			case 5:
+				b += k[4];
+				/* FALLTHROUGH */
+			}
+			a += le32dec(k);
+		} else if (len) {
+			switch (len) {
+			case 4:
+				a += (uint32_t)k[3] << 24;
+				/* FALLTHROUGH */
+			case 3:
+				a += (uint32_t)k[2] << 16;
+				/* FALLTHROUGH */
+			case 2:
+				a += (uint32_t)k[1] << 8;
+				/* FALLTHROUGH */
+			case 1:
+				a += k[0];
+				/* FALLTHROUGH */
+			}
+		}
+	} else {
+		const uint32_t *key32 = key;
+		while (len >= 12) {
+			a += le32toh(key32[0]);
+			b += le32toh(key32[1]);
+			c += le32toh(key32[2]);
+			mix(a, b, c);
+			key32 += 3;
+			len -= 12;
+		}
+		c += orig_len;
+
+		if (len > 8) {
+			c += (le32toh(key32[2]) & mask[len - 9]) << 8;
+			b += le32toh(key32[1]);
+			a += le32toh(key32[0]);
+		} else if (len > 4) {
+			b += le32toh(key32[1]) & mask[len - 5];
+			a += le32toh(key32[0]);
+		} else if (len)
+			a += le32toh(key32[0]) & mask[len - 1];
+	}
+	mix(a, b, c);
+	hashes[0] = a;
+	hashes[1] = b;
+	hashes[2] = c;
+}

Index: src/tests/lib/Atffile
diff -u /dev/null src/tests/lib/Atffile:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/Atffile	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,6 @@
+Content-Type: application/X-atf-atffile; version="1"
+X-NetBSD-Id: "$NetBSD: Atffile,v 1.1 2009/07/20 17:03:38 joerg Exp $"
+
+prop: test-suite = "NetBSD"
+
+tp-glob: *
Index: src/tests/lib/Makefile
diff -u /dev/null src/tests/lib/Makefile:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/Makefile	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,10 @@
+# $NetBSD: Makefile,v 1.1 2009/07/20 17:03:38 joerg Exp $
+
+.include <bsd.own.mk>
+
+SUBDIR=		libc
+
+TESTSDIR=	${TESTSBASE}/lib
+
+.include <bsd.test.mk>
+.include <bsd.subdir.mk>

Index: src/tests/lib/libc/Atffile
diff -u /dev/null src/tests/lib/libc/Atffile:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/libc/Atffile	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,5 @@
+Content-Type: application/X-atf-atffile; version="1"
+
+prop: test-suite = "NetBSD"
+
+tp: stdlib
Index: src/tests/lib/libc/Makefile
diff -u /dev/null src/tests/lib/libc/Makefile:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/libc/Makefile	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,10 @@
+# $NetBSD: Makefile,v 1.1 2009/07/20 17:03:38 joerg Exp $
+
+.include <bsd.own.mk>
+
+SUBDIR+=	stdlib
+
+TESTSDIR=	${TESTSBASE}/lib/libc
+
+.include <bsd.subdir.mk>
+.include <bsd.test.mk>

Index: src/tests/lib/libc/stdlib/Atffile
diff -u /dev/null src/tests/lib/libc/stdlib/Atffile:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/libc/stdlib/Atffile	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,6 @@
+Content-Type: application/X-atf-atffile; version="1"
+X-NetBSD-Id: "$NetBSD: Atffile,v 1.1 2009/07/20 17:03:38 joerg Exp $"
+
+prop: test-suite = "NetBSD"
+
+tp: t_mi_vector_hash
Index: src/tests/lib/libc/stdlib/Makefile
diff -u /dev/null src/tests/lib/libc/stdlib/Makefile:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/libc/stdlib/Makefile	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,9 @@
+# $NetBSD: Makefile,v 1.1 2009/07/20 17:03:38 joerg Exp $
+
+.include <bsd.own.mk>
+
+TESTSDIR=	${TESTSBASE}/lib/libc/stdlib
+
+TESTS_C+=	t_mi_vector_hash
+
+.include <bsd.test.mk>
Index: src/tests/lib/libc/stdlib/t_mi_vector_hash.c
diff -u /dev/null src/tests/lib/libc/stdlib/t_mi_vector_hash.c:1.1
--- /dev/null	Mon Jul 20 17:03:38 2009
+++ src/tests/lib/libc/stdlib/t_mi_vector_hash.c	Mon Jul 20 17:03:38 2009
@@ -0,0 +1,93 @@
+/*	$NetBSD: t_mi_vector_hash.c,v 1.1 2009/07/20 17:03:38 joerg Exp $	*/
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <atf-c.h>
+#include <stdlib.h>
+#include <string.h>
+
+ATF_TC(t_mi_vector_hash);
+
+ATF_TC_HEAD(t_mi_vector_hash, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+	    "Test mi_vector_hash_vector_hash for consistent results");
+}
+
+static const struct testvector {
+	const char *vector;
+	uint32_t hashes[3];
+} testv[] = {
+	{ "hello, world", { 0xd38f7f21, 0xbf6be9ab, 0x37a0e989 } },
+	{ "", { 0x9b2ec03d, 0xdb2b69ae, 0xbd49d10d } },
+	{ "a", { 0x9454baa3, 0xb711c708, 0x29eec818 } },
+	{ "ab", { 0x9a5dca90, 0xdd212644, 0x9879ac41 } },
+	{ "abc", { 0x0b91c470, 0x4770cdf5, 0x251e4793 } },
+	{ "abcd", { 0x5f128df3, 0xf5a667a6, 0x5ae61fa5 } },
+	{ "abcde", { 0x4cbae281, 0x799c0ed5, 0x03a96866 } },
+	{ "abcdef", { 0x507a54c8, 0xb6bd06f4, 0xde922732 } },
+	{ "abcdefg", { 0xae2bca5d, 0x61e960ef, 0xb9e6762c } },
+	{ "abcdefgh", { 0xd1021264, 0x87f6988f, 0x053f775e } },
+	{ "abcdefghi", { 0xe380defc, 0xfc35a811, 0x3a7b0a5f } },
+	{ "abcdefghij", { 0x9a504408, 0x70d2e89d, 0xc9cac242 } },
+	{ "abcdefghijk", { 0x376117d0, 0x89f434d4, 0xe52b8e4c } },
+	{ "abcdefghijkl", { 0x92253599, 0x7b6ff99e, 0x0b1b3ea5 } },
+	{ "abcdefghijklm", { 0x92ee6a52, 0x55587d47, 0x3122b031 } },
+	{ "abcdefghijklmn", { 0x827baf08, 0x1d0ada73, 0xfec330e0 } },
+	{ "abcdefghijklmno", { 0x06ab787d, 0xc1ad17c2, 0x11dccf31 } },
+	{ "abcdefghijklmnop", { 0x2cf18103, 0x638c9268, 0xfa1ecf51 } },
+};
+
+ATF_TC_BODY(t_mi_vector_hash, tc)
+{
+	size_t i, j, len;
+	uint32_t hashes[3];
+	char buf[256];
+
+	for (j = 0; j < 8; ++j) {
+		for (i = 0; i < sizeof(testv) / sizeof(testv[0]); ++i) {
+			len = strlen(testv[i].vector);
+			strcpy(buf + j, testv[i].vector);
+			mi_vector_hash(buf + j, len, 0, hashes);
+			ATF_CHECK_EQ(hashes[0], testv[i].hashes[0]);
+			ATF_CHECK_EQ(hashes[1], testv[i].hashes[1]);
+			ATF_CHECK_EQ(hashes[2], testv[i].hashes[2]);
+		}
+	}
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+	ATF_TP_ADD_TC(tp, t_mi_vector_hash);
+
+	return atf_no_error();
+}

Reply via email to