0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky/*
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * CDDL HEADER START
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky *
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * The contents of this file are subject to the terms of the
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * Common Development and Distribution License (the "License").
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * You may not use this file except in compliance with the License.
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky *
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * or http://www.opensolaris.org/os/licensing.
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * See the License for the specific language governing permissions
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * and limitations under the License.
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky *
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * When distributing Covered Code, include this CDDL HEADER in each
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * If applicable, add the following below this CDDL HEADER, with the
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * fields enclosed by brackets "[]" replaced with your own identifying
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * information: Portions Copyright [yyyy] [name of copyright owner]
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky *
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * CDDL HEADER END
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky */
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky/*
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky */
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky#include <sys/pkp_hash.h>
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky/*
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * Pearson's string hash
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky *
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * See: Communications of the ACM, June 1990 Vol 33 pp 677-680
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky * http://portal.acm.org/citation.cfm?doid=78973.78978
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky */
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky#define MOD2(a, pow_of_2) ((a) & ((pow_of_2) - 1))
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipenskystatic uint_t pkp_tab[PKP_HASH_SIZE] = {
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky1, 87, 49, 12, 176, 178, 102, 166, 121, 193, 6, 84, 249, 230, 44, 163,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky14, 197, 213, 181, 161, 85, 218, 80, 64, 239, 24, 226, 236, 142, 38, 200,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky110, 177, 104, 103, 141, 253, 255, 50, 77, 101, 81, 18, 45, 96, 31, 222,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky25, 107, 190, 70, 86, 237, 240, 34, 72, 242, 20, 214, 244, 227, 149, 235,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky97, 234, 57, 22, 60, 250, 82, 175, 208, 5, 127, 199, 111, 62, 135, 248,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky174, 169, 211, 58, 66, 154, 106, 195, 245, 171, 17, 187, 182, 179, 0, 243,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky132, 56, 148, 75, 128, 133, 158, 100, 130, 126, 91, 13, 153, 246, 216, 219,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky119, 68, 223, 78, 83, 88, 201, 99, 122, 11, 92, 32, 136, 114, 52, 10,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky138, 30, 48, 183, 156, 35, 61, 26, 143, 74, 251, 94, 129, 162, 63, 152,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky170, 7, 115, 167, 241, 206, 3, 150, 55, 59, 151, 220, 90, 53, 23, 131,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky125, 173, 15, 238, 79, 95, 89, 16, 105, 137, 225, 224, 217, 160, 37, 123,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky118, 73, 2, 157, 46, 116, 9, 145, 134, 228, 207, 212, 202, 215, 69, 229,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky27, 188, 67, 124, 168, 252, 42, 4, 29, 108, 21, 247, 19, 205, 39, 203,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky233, 40, 186, 147, 198, 192, 155, 33, 164, 191, 98, 204, 165, 180, 117, 76,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky140, 36, 210, 172, 41, 54, 159, 8, 185, 232, 113, 196, 231, 47, 146, 120,
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky51, 65, 28, 144, 254, 221, 93, 189, 194, 139, 112, 43, 71, 109, 184, 209
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky};
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipenskyuint_t
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipenskypkp_tab_hash(char *str, int len)
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky{
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky uint_t key = 0x12345678; /* arbitrary value */
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky uint_t hash;
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky int i;
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky hash = MOD2((key + len), PKP_HASH_SIZE);
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky for (i = 0; i < len; i++) {
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky hash = MOD2((hash + str[i]), PKP_HASH_SIZE);
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky hash = pkp_tab[hash];
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky }
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky return (hash);
0616fd7f2fe52dfe4b6189a7f510069a5b2aed73Pavel Filipensky}