diff options
Diffstat (limited to 'storage/xtradb/include/ut0rnd.ic')
-rw-r--r-- | storage/xtradb/include/ut0rnd.ic | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/storage/xtradb/include/ut0rnd.ic b/storage/xtradb/include/ut0rnd.ic index 30bd32726fa..024c59e553b 100644 --- a/storage/xtradb/include/ut0rnd.ic +++ b/storage/xtradb/include/ut0rnd.ic @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1994, 2009, Innobase Oy. All Rights Reserved. +Copyright (c) 1994, 2009, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA *****************************************************************************/ @@ -25,6 +25,9 @@ Created 5/30/1994 Heikki Tuuri #define UT_HASH_RANDOM_MASK 1463735687 #define UT_HASH_RANDOM_MASK2 1653893711 + +#ifndef UNIV_INNOCHECKSUM + #define UT_RND1 151117737 #define UT_RND2 119785373 #define UT_RND3 85689495 @@ -156,20 +159,6 @@ ut_hash_ulint( } /*************************************************************//** -Folds a pair of ulints. -@return folded value */ -UNIV_INLINE -ulint -ut_fold_ulint_pair( -/*===============*/ - ulint n1, /*!< in: ulint */ - ulint n2) /*!< in: ulint */ -{ - return(((((n1 ^ n2 ^ UT_HASH_RANDOM_MASK2) << 8) + n1) - ^ UT_HASH_RANDOM_MASK) + n2); -} - -/*************************************************************//** Folds a 64-bit integer. @return folded value */ UNIV_INLINE @@ -203,6 +192,22 @@ ut_fold_string( return(fold); } +#endif /* !UNIV_INNOCHECKSUM */ + +/*************************************************************//** +Folds a pair of ulints. +@return folded value */ +UNIV_INLINE +ulint +ut_fold_ulint_pair( +/*===============*/ + ulint n1, /*!< in: ulint */ + ulint n2) /*!< in: ulint */ +{ + return(((((n1 ^ n2 ^ UT_HASH_RANDOM_MASK2) << 8) + n1) + ^ UT_HASH_RANDOM_MASK) + n2); +} + /*************************************************************//** Folds a binary string. @return folded value */ @@ -213,40 +218,37 @@ ut_fold_binary( const byte* str, /*!< in: string of bytes */ ulint len) /*!< in: length */ { - const byte* str_end = str + len; ulint fold = 0; + const byte* str_end = str + (len & 0xFFFFFFF8); ut_ad(str || !len); while (str < str_end) { - fold = ut_fold_ulint_pair(fold, (ulint)(*str)); - - str++; + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); } - return(fold); -} - -UNIV_INLINE -ulint -ut_fold_binary_32( -/*==============*/ - const byte* str, /*!< in: string of bytes */ - ulint len) /*!< in: length */ -{ - const ib_uint32_t* str_end = (const ib_uint32_t*) (str + len); - const ib_uint32_t* str_32 = (const ib_uint32_t*) str; - ulint fold = 0; - - ut_ad(str); - /* This function is only for word-aligned data */ - ut_ad(len % 4 == 0); - ut_ad((ulint)str % 4 == 0); - - while (str_32 < str_end) { - fold = ut_fold_ulint_pair(fold, (ulint)(*str_32)); - - str_32++; + switch (len & 0x7) { + case 7: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + case 6: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + case 5: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + case 4: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + case 3: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + case 2: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); + case 1: + fold = ut_fold_ulint_pair(fold, (ulint)(*str++)); } return(fold); |