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