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