/*- * Public Domain 2014-2016 MongoDB, Inc. * Public Domain 2008-2014 WiredTiger, Inc. * * This is free and unencumbered software released into the public domain. * * Anyone is free to copy, modify, publish, use, compile, sell, or * distribute this software, either in source code form or as a compiled * binary, for any purpose, commercial or non-commercial, and by any * means. * * In jurisdictions that recognize copyright laws, the author or authors * of this software dedicate any and all copyright interest in the * software to the public domain. We make this dedication for the benefit * of the public at large and to the detriment of our heirs and * successors. We intend this dedication to be an overt act of * relinquishment in perpetuity of all present and future rights to this * software under copyright law. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /* * hash_64 - 64 bit Fowler/Noll/Vo-0 FNV-1a hash code * * @(#) $Revision: 5.1 $ * @(#) $Id: hash_64a.c,v 5.1 2009/06/30 09:01:38 chongo Exp $ * @(#) $Source: /usr/local/src/cmd/fnv/RCS/hash_64a.c,v $ * *** * * Fowler/Noll/Vo hash * * The basis of this hash algorithm was taken from an idea sent * as reviewer comments to the IEEE POSIX P1003.2 committee by: * * Phong Vo (http://www.research.att.com/info/kpv/) * Glenn Fowler (http://www.research.att.com/~gsf/) * * In a subsequent ballot round: * * Landon Curt Noll (http://www.isthe.com/chongo/) * * improved on their algorithm. Some people tried this hash * and found that it worked rather well. In an EMail message * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash. * * FNV hashes are designed to be fast while maintaining a low * collision rate. The FNV speed allows one to quickly hash lots * of data while maintaining a reasonable collision rate. See: * * http://www.isthe.com/chongo/tech/comp/fnv/index.html * * for more details as well as other forms of the FNV hash. * *** * * To use the recommended 64 bit FNV-1a hash, pass FNV1A_64_INIT as the * uint64_t hashval argument to fnv_64a_buf() or fnv_64a_str(). * *** * * Please do not copyright this code. This code is in the public domain. * * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * By: * chongo /\oo/\ * http://www.isthe.com/chongo/ * * Share and Enjoy! :-) */ #include "wt_internal.h" /* * This file contains a 64 bit hash implementation of the FNV 1a 64 bit hash * function. The implementation is from a third party. * * The code has been updated to remove unnecessary content and better comply * with WiredTiger coding standards. The original source code can be found at: * FNV 1a 64 bit: http://www.isthe.com/chongo/src/fnv/hash_64a.c */ /* * 64 bit FNV-1 non-zero initial basis * * The FNV-1 initial basis is the FNV-0 hash of the following 32 octets: * * chongo /\../\ * * NOTE: The \'s above are not back-slashing escape characters. * They are literal ASCII backslash 0x5c characters. * * NOTE: The FNV-1a initial basis is the same value as FNV-1 by definition. */ #define FNV1A_64_INIT ((uint64_t)0xcbf29ce484222325ULL) /* * fnv_64a_buf -- * Perform a 64 bit Fowler/Noll/Vo FNV-1a hash on a buffer * * input: * buf - start of buffer to hash * len - length of buffer in octets * hval - previous hash value or 0 if first call * * returns: * 64 bit hash as a static hash type * * NOTE: To use the recommended 64 bit FNV-1a hash, use FNV1A_64_INIT as the * hval arg on the first call to either fnv_64a_buf() or fnv_64a_str(). */ static inline uint64_t fnv_64a_buf(const void *buf, size_t len, uint64_t hval) { const unsigned char *bp = buf; /* start of buffer */ const unsigned char *be = bp + len; /* beyond end of buffer */ /* * FNV-1a hash each octet of the buffer */ while (bp < be) { /* xor the bottom with the current octet */ hval ^= (uint64_t)*bp++; /* * Multiply by the 64 bit FNV magic prime mod 2^64. The * following shift operation is generally faster than * a multiply operation. */ hval += (hval << 1) + (hval << 4) + (hval << 5) + (hval << 7) + (hval << 8) + (hval << 40); } /* return our new hash value */ return (hval); } /* * __wt_hash_fnv64 -- * WiredTiger wrapper around third party hash implementation. */ uint64_t __wt_hash_fnv64(const void *string, size_t len) { return (fnv_64a_buf(string, len, FNV1A_64_INIT)); }