1251876Speter/* Licensed to the Apache Software Foundation (ASF) under one or more
2251876Speter * contributor license agreements.  See the NOTICE file distributed with
3251876Speter * this work for additional information regarding copyright ownership.
4251876Speter * The ASF licenses this file to You under the Apache License, Version 2.0
5251876Speter * (the "License"); you may not use this file except in compliance with
6251876Speter * the License.  You may obtain a copy of the License at
7251876Speter *
8251876Speter *     http://www.apache.org/licenses/LICENSE-2.0
9251876Speter *
10251876Speter * Unless required by applicable law or agreed to in writing, software
11251876Speter * distributed under the License is distributed on an "AS IS" BASIS,
12251876Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251876Speter * See the License for the specific language governing permissions and
14251876Speter * limitations under the License.
15251876Speter */
16251876Speter
17251876Speter/*
18251876Speter * sdbm - ndbm work-alike hashed database library
19251876Speter * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
20251876Speter * author: oz@nexus.yorku.ca
21251876Speter * status: ex-public domain. keep it that way.
22251876Speter *
23251876Speter * hashing routine
24251876Speter */
25251876Speter
26251876Speter#include "apr_sdbm.h"
27251876Speter#include "sdbm_private.h"
28251876Speter
29251876Speter/*
30251876Speter * polynomial conversion ignoring overflows
31251876Speter * [this seems to work remarkably well, in fact better
32251876Speter * then the ndbm hash function. Replace at your own risk]
33251876Speter * use: 65599	nice.
34251876Speter *      65587   even better.
35251876Speter */
36251876Speterlong sdbm_hash(const char *str, int len)
37251876Speter{
38251876Speter	register unsigned long n = 0;
39251876Speter
40251876Speter#define DUFF	/* go ahead and use the loop-unrolled version */
41251876Speter#ifdef DUFF
42251876Speter
43251876Speter#define HASHC	n = *str++ + 65599 * n
44251876Speter
45251876Speter	if (len > 0) {
46251876Speter		register int loop = (len + 8 - 1) >> 3;
47251876Speter
48251876Speter		switch(len & (8 - 1)) {
49251876Speter		case 0:	do {
50251876Speter			HASHC;	case 7:	HASHC;
51251876Speter		case 6:	HASHC;	case 5:	HASHC;
52251876Speter		case 4:	HASHC;	case 3:	HASHC;
53251876Speter		case 2:	HASHC;	case 1:	HASHC;
54251876Speter			} while (--loop);
55251876Speter		}
56251876Speter
57251876Speter	}
58251876Speter#else
59251876Speter	while (len--)
60251876Speter		n = *str++ + 65599 * n;
61251876Speter#endif
62251876Speter	return n;
63251876Speter}
64