18185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien/*
28185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * Copyright (C) 2012 The Android Open Source Project
38185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien *
48185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * Licensed under the Apache License, Version 2.0 (the "License");
58185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * you may not use this file except in compliance with the License.
68185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * You may obtain a copy of the License at
78185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien *
88185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien *      http://www.apache.org/licenses/LICENSE-2.0
98185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien *
108185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * Unless required by applicable law or agreed to in writing, software
118185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * distributed under the License is distributed on an "AS IS" BASIS,
128185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * See the License for the specific language governing permissions and
148185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * limitations under the License.
158185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien */
168185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
178185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien/* Implementation of Jenkins one-at-a-time hash function. These choices are
188185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * optimized for code size and portability, rather than raw speed. But speed
198185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * should still be quite good.
208185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien **/
218185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
22e402f1fde2deca0b1120e6d582ab9dce59879ae1Romain Guy#ifndef ANDROID_JENKINS_HASH_H
23e402f1fde2deca0b1120e6d582ab9dce59879ae1Romain Guy#define ANDROID_JENKINS_HASH_H
24e402f1fde2deca0b1120e6d582ab9dce59879ae1Romain Guy
258185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien#include <utils/TypeHelpers.h>
268185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
278185e47822465a5c7a9cc6e56a11f16996855d79Raph Leviennamespace android {
288185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
298185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien/* The Jenkins hash of a sequence of 32 bit words A, B, C is:
308185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien * Whiten(Mix(Mix(Mix(0, A), B), C)) */
318185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
328185e47822465a5c7a9cc6e56a11f16996855d79Raph Levieninline uint32_t JenkinsHashMix(uint32_t hash, uint32_t data) {
338185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien    hash += data;
348185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien    hash += (hash << 10);
358185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien    hash ^= (hash >> 6);
368185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien    return hash;
378185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien}
388185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
398185e47822465a5c7a9cc6e56a11f16996855d79Raph Levienhash_t JenkinsHashWhiten(uint32_t hash);
408185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
418185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien/* Helpful utility functions for hashing data in 32 bit chunks */
428185e47822465a5c7a9cc6e56a11f16996855d79Raph Levienuint32_t JenkinsHashMixBytes(uint32_t hash, const uint8_t* bytes, size_t size);
438185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
448185e47822465a5c7a9cc6e56a11f16996855d79Raph Levienuint32_t JenkinsHashMixShorts(uint32_t hash, const uint16_t* shorts, size_t size);
458185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
468185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien}
478185e47822465a5c7a9cc6e56a11f16996855d79Raph Levien
48e402f1fde2deca0b1120e6d582ab9dce59879ae1Romain Guy#endif // ANDROID_JENKINS_HASH_H
49