10384a98d6f61fa47ffde01c15e552f738e88fb94Raphael/* 2493dad966305a7fb555addd367532dd2af275a27San Mehat * Copyright (C) 2012 The Android Open Source Project 3493dad966305a7fb555addd367532dd2af275a27San Mehat * 4493dad966305a7fb555addd367532dd2af275a27San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5493dad966305a7fb555addd367532dd2af275a27San Mehat * you may not use this file except in compliance with the License. 6493dad966305a7fb555addd367532dd2af275a27San Mehat * You may obtain a copy of the License at 7493dad966305a7fb555addd367532dd2af275a27San Mehat * 8493dad966305a7fb555addd367532dd2af275a27San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9493dad966305a7fb555addd367532dd2af275a27San Mehat * 10493dad966305a7fb555addd367532dd2af275a27San Mehat * Unless required by applicable law or agreed to in writing, software 11493dad966305a7fb555addd367532dd2af275a27San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12493dad966305a7fb555addd367532dd2af275a27San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13493dad966305a7fb555addd367532dd2af275a27San Mehat * See the License for the specific language governing permissions and 14493dad966305a7fb555addd367532dd2af275a27San Mehat * limitations under the License. 15493dad966305a7fb555addd367532dd2af275a27San Mehat */ 16493dad966305a7fb555addd367532dd2af275a27San Mehat 17493dad966305a7fb555addd367532dd2af275a27San Mehat/* Implementation of Jenkins one-at-a-time hash function. These choices are 18493dad966305a7fb555addd367532dd2af275a27San Mehat * optimized for code size and portability, rather than raw speed. But speed 19bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * should still be quite good. 20bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown **/ 21493dad966305a7fb555addd367532dd2af275a27San Mehat 22493dad966305a7fb555addd367532dd2af275a27San Mehat#ifndef ANDROID_JENKINS_HASH_H 23493dad966305a7fb555addd367532dd2af275a27San Mehat#define ANDROID_JENKINS_HASH_H 24493dad966305a7fb555addd367532dd2af275a27San Mehat 25493dad966305a7fb555addd367532dd2af275a27San Mehat#include <utils/TypeHelpers.h> 26493dad966305a7fb555addd367532dd2af275a27San Mehat 27bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownnamespace android { 28bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 290384a98d6f61fa47ffde01c15e552f738e88fb94Raphael/* The Jenkins hash of a sequence of 32 bit words A, B, C is: 30bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Whiten(Mix(Mix(Mix(0, A), B), C)) */ 31bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 32bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#ifdef __clang__ 33bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown__attribute__((no_sanitize("integer"))) 34bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#endif 35bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Browninline uint32_t JenkinsHashMix(uint32_t hash, uint32_t data) { 36bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown hash += data; 37bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown hash += (hash << 10); 38d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat hash ^= (hash >> 6); 39bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown return hash; 400384a98d6f61fa47ffde01c15e552f738e88fb94Raphael} 41493dad966305a7fb555addd367532dd2af275a27San Mehat 4286b121523d7d3634bf5ac07b6e238b36b3e75f0aBrad Fitzpatrickhash_t JenkinsHashWhiten(uint32_t hash); 43493dad966305a7fb555addd367532dd2af275a27San Mehat 443cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat/* Helpful utility functions for hashing data in 32 bit chunks */ 453cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehatuint32_t JenkinsHashMixBytes(uint32_t hash, const uint8_t* bytes, size_t size); 463cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 473cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehatuint32_t JenkinsHashMixShorts(uint32_t hash, const uint16_t* shorts, size_t size); 483cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 493cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat} 503cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 513cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif // ANDROID_JENKINS_HASH_H 52805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat