/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/


/*
These functions are based on:

-------------------------------------------------------------------------------
lookup3.c, by Bob Jenkins, May 2006, Public Domain.

These are functions for producing 32-bit hashes for hash table lookup.
hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
are externally useful functions.  Routines to test the hash are included
if SELF_TEST is defined.  You can use this free for any purpose.  It's in
the public domain.  It has no warranty.

You probably want to use hashlittle().  hashlittle() and hashbig()
hash byte arrays.  hashlittle() is is faster than hashbig() on
little-endian machines.  Intel and AMD are little-endian machines.
On second thought, you probably want hashlittle2(), which is identical to
hashlittle() except it returns two 32-bit hashes for the price of one.
You could implement hashbig2() if you wanted but I haven't bothered here.

If you want to find a hash of, say, exactly 7 integers, do
  a = i1;  b = i2;  c = i3;
  mix(a,b,c);
  a += i4; b += i5; c += i6;
  mix(a,b,c);
  a += i7;
  final(a,b,c);
then use c as the hash value.  If you have a variable length array of
4-byte integers to hash, use hashword().  If you have a byte array (like
a character string), use hashlittle().  If you have several byte arrays, or
a mix of things, see the comments above hashlittle().

Why is this so big?  I read 12 bytes at a time into 3 4-byte integers,
then mix those integers.  This is fast (you can do a lot more thorough
mixing with 12*3 instructions on 3 integers than you can with 3 instructions
on 1 byte), but shoehorning those bytes into integers efficiently is messy.
-------------------------------------------------------------------------------
*/

#include <QtGlobal>

#if Q_BYTE_ORDER == Q_BIG_ENDIAN
# define HASH_LITTLE_ENDIAN 0
# define HASH_BIG_ENDIAN 1
#else
# define HASH_LITTLE_ENDIAN 1
# define HASH_BIG_ENDIAN 0
#endif

#define hashsize(n) ((quint32)1<<(n))
#define hashmask(n) (hashsize(n)-1)
#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))

/*
-------------------------------------------------------------------------------
mix -- mix 3 32-bit values reversibly.

This is reversible, so any information in (a,b,c) before mix() is
still in (a,b,c) after mix().

If four pairs of (a,b,c) inputs are run through mix(), or through
mix() in reverse, there are at least 32 bits of the output that
are sometimes the same for one pair and different for another pair.
This was tested for:
* pairs that differed by one bit, by two bits, in any combination
  of top bits of (a,b,c), or in any combination of bottom bits of
  (a,b,c).
* "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
  the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
  is commonly produced by subtraction) look like a single 1-bit
  difference.
* the base values were pseudorandom, all zero but one bit set, or
  all zero plus a counter that starts at zero.

Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
satisfy this are
    4  6  8 16 19  4
    9 15  3 18 27 15
   14  9  3  7 17  3
Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
for "differ" defined as + with a one-bit base and a two-bit delta.  I
used http://burtleburtle.net/bob/hash/avalanche.html to choose
the operations, constants, and arrangements of the variables.

This does not achieve avalanche.  There are input bits of (a,b,c)
that fail to affect some output bits of (a,b,c), especially of a.  The
most thoroughly mixed value is c, but it doesn't really even achieve
avalanche in c.

This allows some parallelism.  Read-after-writes are good at doubling
the number of bits affected, so the goal of mixing pulls in the opposite
direction as the goal of parallelism.  I did what I could.  Rotates
seem to cost as much as shifts on every machine I could lay my hands
on, and rotates are much kinder to the top and bottom bits, so I used
rotates.
-------------------------------------------------------------------------------
*/
#define mix(a,b,c) \
{ \
  a -= c;  a ^= rot(c, 4);  c += b; \
  b -= a;  b ^= rot(a, 6);  a += c; \
  c -= b;  c ^= rot(b, 8);  b += a; \
  a -= c;  a ^= rot(c,16);  c += b; \
  b -= a;  b ^= rot(a,19);  a += c; \
  c -= b;  c ^= rot(b, 4);  b += a; \
}

/*
-------------------------------------------------------------------------------
final -- final mixing of 3 32-bit values (a,b,c) into c

Pairs of (a,b,c) values differing in only a few bits will usually
produce values of c that look totally different.  This was tested for
* pairs that differed by one bit, by two bits, in any combination
  of top bits of (a,b,c), or in any combination of bottom bits of
  (a,b,c).
* "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
  the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
  is commonly produced by subtraction) look like a single 1-bit
  difference.
* the base values were pseudorandom, all zero but one bit set, or
  all zero plus a counter that starts at zero.

These constants passed:
 14 11 25 16 4 14 24
 12 14 25 16 4 14 24
and these came close:
  4  8 15 26 3 22 24
 10  8 15 26 3 22 24
 11  8 15 26 3 22 24
-------------------------------------------------------------------------------
*/
#define final(a,b,c) \
{ \
  c ^= b; c -= rot(b,14); \
  a ^= c; a -= rot(c,11); \
  b ^= a; b -= rot(a,25); \
  c ^= b; c -= rot(b,16); \
  a ^= c; a -= rot(c,4);  \
  b ^= a; b -= rot(a,14); \
  c ^= b; c -= rot(b,24); \
}

/*
--------------------------------------------------------------------
 This works on all machines.  To be useful, it requires
 -- that the key be an array of quint32's, and
 -- that the length be the number of quint32's in the key

 The function hashword() is identical to hashlittle() on little-endian
 machines, and identical to hashbig() on big-endian machines,
 except that the length has to be measured in quint32s rather than in
 bytes.  hashlittle() is more complicated than hashword() only because
 hashlittle() has to dance around fitting the key bytes into registers.
--------------------------------------------------------------------
*/
quint32 hashword(
const quint32 *k,                   /* the key, an array of quint32 values */
size_t          length,               /* the length of the key, in quint32s */
quint32        initval)         /* the previous hash, or an arbitrary value */
{
  quint32 a,b,c;

  /* Set up the internal state */
  a = b = c = 0xdeadbeef + (((quint32)length)<<2) + initval;

  /*------------------------------------------------- handle most of the key */
  while (length > 3)
  {
    a += k[0];
    b += k[1];
    c += k[2];
    mix(a,b,c);
    length -= 3;
    k += 3;
  }

  /*------------------------------------------- handle the last 3 quint32's */
  switch(length)                     /* all the case statements fall through */
  {
  case 3 : c+=k[2];
           Q_FALLTHROUGH();
  case 2 : b+=k[1];
           Q_FALLTHROUGH();
  case 1 : a+=k[0];
           final(a,b,c);
           Q_FALLTHROUGH();
  case 0:     /* case 0: nothing left to add */
    break;
  }
  /*------------------------------------------------------ report the result */
  return c;
}


/*
--------------------------------------------------------------------
hashword2() -- same as hashword(), but take two seeds and return two
32-bit values.  pc and pb must both be nonnull, and *pc and *pb must
both be initialized with seeds.  If you pass in (*pb)==0, the output
(*pc) will be the same as the return value from hashword().
--------------------------------------------------------------------
*/
void hashword2 (
const quint32 *k,                   /* the key, an array of quint32 values */
size_t          length,               /* the length of the key, in quint32s */
quint32       *pc,                      /* IN: seed OUT: primary hash value */
quint32       *pb)               /* IN: more seed OUT: secondary hash value */
{
  quint32 a,b,c;

  /* Set up the internal state */
  a = b = c = 0xdeadbeef + ((quint32)(length<<2)) + *pc;
  c += *pb;

  /*------------------------------------------------- handle most of the key */
  while (length > 3)
  {
    a += k[0];
    b += k[1];
    c += k[2];
    mix(a,b,c);
    length -= 3;
    k += 3;
  }

  /*------------------------------------------- handle the last 3 quint32's */
  switch(length)                     /* all the case statements fall through */
  {
  case 3 : c+=k[2];
           Q_FALLTHROUGH();
  case 2 : b+=k[1];
           Q_FALLTHROUGH();
  case 1 : a+=k[0];
    final(a,b,c);
           Q_FALLTHROUGH();
  case 0:     /* case 0: nothing left to add */
    break;
  }
  /*------------------------------------------------------ report the result */
  *pc=c; *pb=b;
}


/*
-------------------------------------------------------------------------------
hashlittle() -- hash a variable-length key into a 32-bit value
  k       : the key (the unaligned variable-length array of bytes)
  length  : the length of the key, counting by bytes
  initval : can be any 4-byte value
Returns a 32-bit value.  Every bit of the key affects every bit of
the return value.  Two keys differing by one or two bits will have
totally different hash values.

The best hash table sizes are powers of 2.  There is no need to do
mod a prime (mod is sooo slow!).  If you need less than 32 bits,
use a bitmask.  For example, if you need only 10 bits, do
  h = (h & hashmask(10));
In which case, the hash table should have hashsize(10) elements.

If you are hashing n strings (quint8 **)k, do it like this:
  for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);

By Bob Jenkins, 2006.  bob_jenkins@burtleburtle.net.  You may use this
code any way you wish, private, educational, or commercial.  It's free.

Use for hash table lookup, or anything where one collision in 2^^32 is
acceptable.  Do NOT use for cryptographic purposes.
-------------------------------------------------------------------------------
*/

quint32 hashlittle( const void *key, size_t length, quint32 initval)
{
  quint32 a,b,c;                                          /* internal state */
  union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */

  /* Set up the internal state */
  a = b = c = 0xdeadbeef + ((quint32)length) + initval;

  u.ptr = key;
  if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
    const quint32 *k = (const quint32 *)key;         /* read 32-bit chunks */

    /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
    while (length > 12)
    {
      a += k[0];
      b += k[1];
      c += k[2];
      mix(a,b,c);
      length -= 12;
      k += 3;
    }

    /*----------------------------- handle the last (probably partial) block */
    /*
     * "k[2]&0xffffff" actually reads beyond the end of the string, but
     * then masks off the part it's not allowed to read.  Because the
     * string is aligned, the masked-off tail is in the same word as the
     * rest of the string.  Every machine with memory protection I've seen
     * does it on word boundaries, so is OK with this.  But VALGRIND will
     * still catch it and complain.  The masking trick does make the hash
     * noticably faster for short strings (like English words).
     */
#ifndef VALGRIND

    switch(length)
    {
    case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
    case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
    case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
    case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
    case 8 : b+=k[1]; a+=k[0]; break;
    case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
    case 6 : b+=k[1]&0xffff; a+=k[0]; break;
    case 5 : b+=k[1]&0xff; a+=k[0]; break;
    case 4 : a+=k[0]; break;
    case 3 : a+=k[0]&0xffffff; break;
    case 2 : a+=k[0]&0xffff; break;
    case 1 : a+=k[0]&0xff; break;
    case 0 : return c;              /* zero length strings require no mixing */
    }

#else /* make valgrind happy */

    const quint8  *k8 = (const quint8 *)k;
    switch(length)
    {
    case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
    case 11: c+=((quint32)k8[10])<<16;
             Q_FALLTHROUGH();
    case 10: c+=((quint32)k8[9])<<8;
             Q_FALLTHROUGH();
    case 9 : c+=k8[8];
             Q_FALLTHROUGH();
    case 8 : b+=k[1]; a+=k[0]; break;
    case 7 : b+=((quint32)k8[6])<<16;
             Q_FALLTHROUGH();
    case 6 : b+=((quint32)k8[5])<<8;
             Q_FALLTHROUGH();
    case 5 : b+=k8[4];
             Q_FALLTHROUGH();
    case 4 : a+=k[0]; break;
    case 3 : a+=((quint32)k8[2])<<16;
             Q_FALLTHROUGH();
    case 2 : a+=((quint32)k8[1])<<8;
             Q_FALLTHROUGH();
    case 1 : a+=k8[0]; break;
    case 0 : return c;
    }

#endif /* !valgrind */

  } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
    const quint16 *k = (const quint16 *)key;         /* read 16-bit chunks */
    const quint8  *k8;

    /*--------------- all but last block: aligned reads and different mixing */
    while (length > 12)
    {
      a += k[0] + (((quint32)k[1])<<16);
      b += k[2] + (((quint32)k[3])<<16);
      c += k[4] + (((quint32)k[5])<<16);
      mix(a,b,c);
      length -= 12;
      k += 6;
    }

    /*----------------------------- handle the last (probably partial) block */
    k8 = (const quint8 *)k;
    switch(length)
    {
    case 12: c+=k[4]+(((quint32)k[5])<<16);
             b+=k[2]+(((quint32)k[3])<<16);
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 11: c+=((quint32)k8[10])<<16;
             Q_FALLTHROUGH();
    case 10: c+=k[4];
             b+=k[2]+(((quint32)k[3])<<16);
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 9 : c+=k8[8];
             Q_FALLTHROUGH();
    case 8 : b+=k[2]+(((quint32)k[3])<<16);
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 7 : b+=((quint32)k8[6])<<16;
             Q_FALLTHROUGH();
    case 6 : b+=k[2];
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 5 : b+=k8[4];
             Q_FALLTHROUGH();
    case 4 : a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 3 : a+=((quint32)k8[2])<<16;
             Q_FALLTHROUGH();
    case 2 : a+=k[0];
             break;
    case 1 : a+=k8[0];
             break;
    case 0 : return c;                     /* zero length requires no mixing */
    }

  } else {                        /* need to read the key one byte at a time */
    const quint8 *k = (const quint8 *)key;

    /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
    while (length > 12)
    {
      a += k[0];
      a += ((quint32)k[1])<<8;
      a += ((quint32)k[2])<<16;
      a += ((quint32)k[3])<<24;
      b += k[4];
      b += ((quint32)k[5])<<8;
      b += ((quint32)k[6])<<16;
      b += ((quint32)k[7])<<24;
      c += k[8];
      c += ((quint32)k[9])<<8;
      c += ((quint32)k[10])<<16;
      c += ((quint32)k[11])<<24;
      mix(a,b,c);
      length -= 12;
      k += 12;
    }

    /*-------------------------------- last block: affect all 32 bits of (c) */
    switch(length)                   /* all the case statements fall through */
    {
    case 12: c+=((quint32)k[11])<<24;
             Q_FALLTHROUGH();
    case 11: c+=((quint32)k[10])<<16;
             Q_FALLTHROUGH();
    case 10: c+=((quint32)k[9])<<8;
             Q_FALLTHROUGH();
    case 9 : c+=k[8];
             Q_FALLTHROUGH();
    case 8 : b+=((quint32)k[7])<<24;
             Q_FALLTHROUGH();
    case 7 : b+=((quint32)k[6])<<16;
             Q_FALLTHROUGH();
    case 6 : b+=((quint32)k[5])<<8;
             Q_FALLTHROUGH();
    case 5 : b+=k[4];
             Q_FALLTHROUGH();
    case 4 : a+=((quint32)k[3])<<24;
             Q_FALLTHROUGH();
    case 3 : a+=((quint32)k[2])<<16;
             Q_FALLTHROUGH();
    case 2 : a+=((quint32)k[1])<<8;
             Q_FALLTHROUGH();
    case 1 : a+=k[0];
             break;
    case 0 : return c;
    }
  }

  final(a,b,c);
  return c;
}


/*
 * hashlittle2: return 2 32-bit hash values
 *
 * This is identical to hashlittle(), except it returns two 32-bit hash
 * values instead of just one.  This is good enough for hash table
 * lookup with 2^^64 buckets, or if you want a second hash if you're not
 * happy with the first, or if you want a probably-unique 64-bit ID for
 * the key.  *pc is better mixed than *pb, so use *pc first.  If you want
 * a 64-bit value do something like "*pc + (((uint64_t)*pb)<<32)".
 */
void hashlittle2(
  const void *key,       /* the key to hash */
  size_t      length,    /* length of the key */
  quint32   *pc,        /* IN: primary initval, OUT: primary hash */
  quint32   *pb)        /* IN: secondary initval, OUT: secondary hash */
{
  quint32 a,b,c;                                          /* internal state */
  union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */

  /* Set up the internal state */
  a = b = c = 0xdeadbeef + ((quint32)length) + *pc;
  c += *pb;

  u.ptr = key;
  if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
    const quint32 *k = (const quint32 *)key;         /* read 32-bit chunks */

    /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
    while (length > 12)
    {
      a += k[0];
      b += k[1];
      c += k[2];
      mix(a,b,c);
      length -= 12;
      k += 3;
    }

    /*----------------------------- handle the last (probably partial) block */
    /*
     * "k[2]&0xffffff" actually reads beyond the end of the string, but
     * then masks off the part it's not allowed to read.  Because the
     * string is aligned, the masked-off tail is in the same word as the
     * rest of the string.  Every machine with memory protection I've seen
     * does it on word boundaries, so is OK with this.  But VALGRIND will
     * still catch it and complain.  The masking trick does make the hash
     * noticably faster for short strings (like English words).
     */
#ifndef VALGRIND

    switch(length)
    {
    case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
    case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
    case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
    case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
    case 8 : b+=k[1]; a+=k[0]; break;
    case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
    case 6 : b+=k[1]&0xffff; a+=k[0]; break;
    case 5 : b+=k[1]&0xff; a+=k[0]; break;
    case 4 : a+=k[0]; break;
    case 3 : a+=k[0]&0xffffff; break;
    case 2 : a+=k[0]&0xffff; break;
    case 1 : a+=k[0]&0xff; break;
    case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
    }

#else /* make valgrind happy */

    const quint8  *k8 = (const quint8 *)k;
    switch(length)
    {
    case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
    case 11: c+=((quint32)k8[10])<<16;
             Q_FALLTHROUGH();
    case 10: c+=((quint32)k8[9])<<8;
             Q_FALLTHROUGH();
    case 9 : c+=k8[8];
             Q_FALLTHROUGH();
    case 8 : b+=k[1]; a+=k[0]; break;
    case 7 : b+=((quint32)k8[6])<<16;
             Q_FALLTHROUGH();
    case 6 : b+=((quint32)k8[5])<<8;
             Q_FALLTHROUGH();
    case 5 : b+=k8[4];
             Q_FALLTHROUGH();
    case 4 : a+=k[0]; break;
    case 3 : a+=((quint32)k8[2])<<16;
             Q_FALLTHROUGH();
    case 2 : a+=((quint32)k8[1])<<8;
             Q_FALLTHROUGH();
    case 1 : a+=k8[0]; break;
    case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
    }

#endif /* !valgrind */

  } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
    const quint16 *k = (const quint16 *)key;         /* read 16-bit chunks */
    const quint8  *k8;

    /*--------------- all but last block: aligned reads and different mixing */
    while (length > 12)
    {
      a += k[0] + (((quint32)k[1])<<16);
      b += k[2] + (((quint32)k[3])<<16);
      c += k[4] + (((quint32)k[5])<<16);
      mix(a,b,c);
      length -= 12;
      k += 6;
    }

    /*----------------------------- handle the last (probably partial) block */
    k8 = (const quint8 *)k;
    switch(length)
    {
    case 12: c+=k[4]+(((quint32)k[5])<<16);
             b+=k[2]+(((quint32)k[3])<<16);
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 11: c+=((quint32)k8[10])<<16;
             Q_FALLTHROUGH();
    case 10: c+=k[4];
             b+=k[2]+(((quint32)k[3])<<16);
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 9 : c+=k8[8];
             Q_FALLTHROUGH();
    case 8 : b+=k[2]+(((quint32)k[3])<<16);
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 7 : b+=((quint32)k8[6])<<16;
             Q_FALLTHROUGH();
    case 6 : b+=k[2];
             a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 5 : b+=k8[4];
             Q_FALLTHROUGH();
    case 4 : a+=k[0]+(((quint32)k[1])<<16);
             break;
    case 3 : a+=((quint32)k8[2])<<16;
             Q_FALLTHROUGH();
    case 2 : a+=k[0];
             break;
    case 1 : a+=k8[0];
             break;
    case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
    }

  } else {                        /* need to read the key one byte at a time */
    const quint8 *k = (const quint8 *)key;

    /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
    while (length > 12)
    {
      a += k[0];
      a += ((quint32)k[1])<<8;
      a += ((quint32)k[2])<<16;
      a += ((quint32)k[3])<<24;
      b += k[4];
      b += ((quint32)k[5])<<8;
      b += ((quint32)k[6])<<16;
      b += ((quint32)k[7])<<24;
      c += k[8];
      c += ((quint32)k[9])<<8;
      c += ((quint32)k[10])<<16;
      c += ((quint32)k[11])<<24;
      mix(a,b,c);
      length -= 12;
      k += 12;
    }

    /*-------------------------------- last block: affect all 32 bits of (c) */
    switch(length)                   /* all the case statements fall through */
    {
    case 12: c+=((quint32)k[11])<<24;
             Q_FALLTHROUGH();
    case 11: c+=((quint32)k[10])<<16;
             Q_FALLTHROUGH();
    case 10: c+=((quint32)k[9])<<8;
             Q_FALLTHROUGH();
    case 9 : c+=k[8];
             Q_FALLTHROUGH();
    case 8 : b+=((quint32)k[7])<<24;
             Q_FALLTHROUGH();
    case 7 : b+=((quint32)k[6])<<16;
             Q_FALLTHROUGH();
    case 6 : b+=((quint32)k[5])<<8;
             Q_FALLTHROUGH();
    case 5 : b+=k[4];
             Q_FALLTHROUGH();
    case 4 : a+=((quint32)k[3])<<24;
             Q_FALLTHROUGH();
    case 3 : a+=((quint32)k[2])<<16;
             Q_FALLTHROUGH();
    case 2 : a+=((quint32)k[1])<<8;
             Q_FALLTHROUGH();
    case 1 : a+=k[0];
             break;
    case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
    }
  }

  final(a,b,c);
  *pc=c; *pb=b;
}



/*
 * hashbig():
 * This is the same as hashword() on big-endian machines.  It is different
 * from hashlittle() on all machines.  hashbig() takes advantage of
 * big-endian byte ordering.
 */
quint32 hashbig( const void *key, size_t length, quint32 initval)
{
  quint32 a,b,c;
  union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */

  /* Set up the internal state */
  a = b = c = 0xdeadbeef + ((quint32)length) + initval;

  u.ptr = key;
  if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
    const quint32 *k = (const quint32 *)key;         /* read 32-bit chunks */

    /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
    while (length > 12)
    {
      a += k[0];
      b += k[1];
      c += k[2];
      mix(a,b,c);
      length -= 12;
      k += 3;
    }

    /*----------------------------- handle the last (probably partial) block */
    /*
     * "k[2]<<8" actually reads beyond the end of the string, but
     * then shifts out the part it's not allowed to read.  Because the
     * string is aligned, the illegal read is in the same word as the
     * rest of the string.  Every machine with memory protection I've seen
     * does it on word boundaries, so is OK with this.  But VALGRIND will
     * still catch it and complain.  The masking trick does make the hash
     * noticably faster for short strings (like English words).
     */
#ifndef VALGRIND

    switch(length)
    {
    case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
    case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0]; break;
    case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0]; break;
    case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0]; break;
    case 8 : b+=k[1]; a+=k[0]; break;
    case 7 : b+=k[1]&0xffffff00; a+=k[0]; break;
    case 6 : b+=k[1]&0xffff0000; a+=k[0]; break;
    case 5 : b+=k[1]&0xff000000; a+=k[0]; break;
    case 4 : a+=k[0]; break;
    case 3 : a+=k[0]&0xffffff00; break;
    case 2 : a+=k[0]&0xffff0000; break;
    case 1 : a+=k[0]&0xff000000; break;
    case 0 : return c;              /* zero length strings require no mixing */
    }

#else  /* make valgrind happy */

    const quint8 *k8 = (const quint8 *)k;
    switch(length)                   /* all the case statements fall through */
    {
    case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
    case 11: c+=((quint32)k8[10])<<8;
             Q_FALLTHROUGH();
    case 10: c+=((quint32)k8[9])<<16;
             Q_FALLTHROUGH();
    case 9 : c+=((quint32)k8[8])<<24;
             Q_FALLTHROUGH();
    case 8 : b+=k[1]; a+=k[0]; break;
    case 7 : b+=((quint32)k8[6])<<8;
             Q_FALLTHROUGH();
    case 6 : b+=((quint32)k8[5])<<16;
             Q_FALLTHROUGH();
    case 5 : b+=((quint32)k8[4])<<24;
             Q_FALLTHROUGH();
    case 4 : a+=k[0]; break;
    case 3 : a+=((quint32)k8[2])<<8;
             Q_FALLTHROUGH();
    case 2 : a+=((quint32)k8[1])<<16;
             Q_FALLTHROUGH();
    case 1 : a+=((quint32)k8[0])<<24; break;
    case 0 : return c;
    }

#endif /* !VALGRIND */

  } else {                        /* need to read the key one byte at a time */
    const quint8 *k = (const quint8 *)key;

    /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
    while (length > 12)
    {
      a += ((quint32)k[0])<<24;
      a += ((quint32)k[1])<<16;
      a += ((quint32)k[2])<<8;
      a += ((quint32)k[3]);
      b += ((quint32)k[4])<<24;
      b += ((quint32)k[5])<<16;
      b += ((quint32)k[6])<<8;
      b += ((quint32)k[7]);
      c += ((quint32)k[8])<<24;
      c += ((quint32)k[9])<<16;
      c += ((quint32)k[10])<<8;
      c += ((quint32)k[11]);
      mix(a,b,c);
      length -= 12;
      k += 12;
    }

    /*-------------------------------- last block: affect all 32 bits of (c) */
    switch(length)                   /* all the case statements fall through */
    {
    case 12: c+=k[11];
             Q_FALLTHROUGH();
    case 11: c+=((quint32)k[10])<<8;
             Q_FALLTHROUGH();
    case 10: c+=((quint32)k[9])<<16;
             Q_FALLTHROUGH();
    case 9 : c+=((quint32)k[8])<<24;
             Q_FALLTHROUGH();
    case 8 : b+=k[7];
             Q_FALLTHROUGH();
    case 7 : b+=((quint32)k[6])<<8;
             Q_FALLTHROUGH();
    case 6 : b+=((quint32)k[5])<<16;
             Q_FALLTHROUGH();
    case 5 : b+=((quint32)k[4])<<24;
             Q_FALLTHROUGH();
    case 4 : a+=k[3];
             Q_FALLTHROUGH();
    case 3 : a+=((quint32)k[2])<<8;
             Q_FALLTHROUGH();
    case 2 : a+=((quint32)k[1])<<16;
             Q_FALLTHROUGH();
    case 1 : a+=((quint32)k[0])<<24;
             break;
    case 0 : return c;
    }
  }

  final(a,b,c);
  return c;
}
