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