1b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien/* 2b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * Copyright (C) 2012 The Android Open Source Project 3b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * 4b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * Licensed under the Apache License, Version 2.0 (the "License"); 5b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * you may not use this file except in compliance with the License. 6b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * You may obtain a copy of the License at 7b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * 8b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * http://www.apache.org/licenses/LICENSE-2.0 9b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * 10b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * Unless required by applicable law or agreed to in writing, software 11b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * distributed under the License is distributed on an "AS IS" BASIS, 12b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * See the License for the specific language governing permissions and 14b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * limitations under the License. 15b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien */ 16b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 17b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien/* Implementation of Jenkins one-at-a-time hash function. These choices are 18b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * optimized for code size and portability, rather than raw speed. But speed 19b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * should still be quite good. 20b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien **/ 21b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 22bdce9baa880990f521061bc7d1498cb07d7efc01Romain Guy#ifndef ANDROID_JENKINS_HASH_H 23bdce9baa880990f521061bc7d1498cb07d7efc01Romain Guy#define ANDROID_JENKINS_HASH_H 24bdce9baa880990f521061bc7d1498cb07d7efc01Romain Guy 25b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien#include <utils/TypeHelpers.h> 26b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 27b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Leviennamespace android { 28b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 29b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien/* The Jenkins hash of a sequence of 32 bit words A, B, C is: 30b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien * Whiten(Mix(Mix(Mix(0, A), B), C)) */ 31b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 321f286989986a384e34d9de1acf8899439506695aNick Kralevich#ifdef __clang__ 331f286989986a384e34d9de1acf8899439506695aNick Kralevich__attribute__((no_sanitize("integer"))) 341f286989986a384e34d9de1acf8899439506695aNick Kralevich#endif 35b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levieninline uint32_t JenkinsHashMix(uint32_t hash, uint32_t data) { 36b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien hash += data; 37b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien hash += (hash << 10); 38b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien hash ^= (hash >> 6); 39b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien return hash; 40b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien} 41b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 42b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levienhash_t JenkinsHashWhiten(uint32_t hash); 43b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 44b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien/* Helpful utility functions for hashing data in 32 bit chunks */ 45b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levienuint32_t JenkinsHashMixBytes(uint32_t hash, const uint8_t* bytes, size_t size); 46b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 47b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levienuint32_t JenkinsHashMixShorts(uint32_t hash, const uint16_t* shorts, size_t size); 48b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 49b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien} 50b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levien 51bdce9baa880990f521061bc7d1498cb07d7efc01Romain Guy#endif // ANDROID_JENKINS_HASH_H 52