xref: /netbsd-src/lib/libintl/strhash.c (revision 4271bf2ec5b5fe548960e35f4ee60f491de8a21d)
1*4271bf2eSjunyoung /*	$NetBSD: strhash.c,v 1.3 2007/09/25 08:19:09 junyoung Exp $	*/
229be49b4Stshiozak 
329be49b4Stshiozak /*-
429be49b4Stshiozak  * Copyright (c)2003, 2004 Citrus Project,
529be49b4Stshiozak  * All rights reserved.
629be49b4Stshiozak  *
729be49b4Stshiozak  * Redistribution and use in source and binary forms, with or without
829be49b4Stshiozak  * modification, are permitted provided that the following conditions
929be49b4Stshiozak  * are met:
1029be49b4Stshiozak  * 1. Redistributions of source code must retain the above copyright
1129be49b4Stshiozak  *    notice, this list of conditions and the following disclaimer.
1229be49b4Stshiozak  * 2. Redistributions in binary form must reproduce the above copyright
1329be49b4Stshiozak  *    notice, this list of conditions and the following disclaimer in the
1429be49b4Stshiozak  *    documentation and/or other materials provided with the distribution.
1529be49b4Stshiozak  *
1629be49b4Stshiozak  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1729be49b4Stshiozak  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1829be49b4Stshiozak  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1929be49b4Stshiozak  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2029be49b4Stshiozak  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2129be49b4Stshiozak  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2229be49b4Stshiozak  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2329be49b4Stshiozak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2429be49b4Stshiozak  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2529be49b4Stshiozak  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2629be49b4Stshiozak  * SUCH DAMAGE.
2729be49b4Stshiozak  */
2829be49b4Stshiozak 
2929be49b4Stshiozak #include <sys/cdefs.h>
3029be49b4Stshiozak #if defined(LIBC_SCCS) && !defined(lint)
31*4271bf2eSjunyoung __RCSID("$NetBSD: strhash.c,v 1.3 2007/09/25 08:19:09 junyoung Exp $");
3229be49b4Stshiozak #endif /* LIBC_SCCS and not lint */
3329be49b4Stshiozak 
3429be49b4Stshiozak #include <sys/param.h>
3529be49b4Stshiozak #include <sys/types.h>
3629be49b4Stshiozak 
3729be49b4Stshiozak #include "libintl_local.h"
3829be49b4Stshiozak 
3929be49b4Stshiozak /*
4029be49b4Stshiozak  * string hash function by P.J.Weinberger.
4129be49b4Stshiozak  * this implementation is derived from src/lib/libc/citrus/citrus_db_hash.c.
4229be49b4Stshiozak  */
43*4271bf2eSjunyoung uint32_t
4429be49b4Stshiozak /*ARGSUSED*/
__intl_string_hash(const char * str)4529be49b4Stshiozak __intl_string_hash(const char *str)
4629be49b4Stshiozak {
47*4271bf2eSjunyoung 	const uint8_t *p;
48*4271bf2eSjunyoung 	uint32_t hash = 0, tmp;
4929be49b4Stshiozak 
50*4271bf2eSjunyoung 	for (p = (const uint8_t *)str; *p; p++) {
5129be49b4Stshiozak 		hash <<= 4;
5229be49b4Stshiozak 		hash += *p;
5329be49b4Stshiozak 		tmp = hash & 0xF0000000;
5429be49b4Stshiozak 		if (tmp != 0) {
5529be49b4Stshiozak 			hash ^= tmp;
5629be49b4Stshiozak 			hash ^= tmp >> 24;
5729be49b4Stshiozak 		}
5829be49b4Stshiozak 	}
5929be49b4Stshiozak 	return hash;
6029be49b4Stshiozak }
61