uint32 Hash32StringWithSeed()

in src/kudu/gutil/hash/jenkins.cc [73:145]


uint32 Hash32StringWithSeed(const char *s, uint32 len, uint32 c) {
  uint32 a, b;
  uint32 keylen;

  a = b = 0x9e3779b9UL;           // the golden ratio; an arbitrary value

  keylen = len;
  if (keylen >= 4 * sizeof(a)) {
    uint32 word32AtOffset0 = Google1At(s);
    do {
      a += word32AtOffset0;
      b += Google1At(s + sizeof(a));
      c += Google1At(s + sizeof(a) * 2);
      s += 3 * sizeof(a);
      word32AtOffset0 = Google1At(s);
      mix(a, b, c);
      keylen -= 3 * static_cast<uint32>(sizeof(a));
    } while (keylen >= 4 * sizeof(a));
    if (keylen >= 3 * sizeof(a)) {
      a += word32AtOffset0;
      b += Google1At(s + sizeof(a));
      c += Google1At(s + sizeof(a) * 2);
      s += 3 * sizeof(a);
      mix(a, b, c);
      keylen -= 3 * static_cast<uint32>(sizeof(a));
      DCHECK_LT(keylen, sizeof(a));
      c += len;
      switch ( keylen ) {           // deal with rest.  Cases fall through
        case 3 : a += char2unsigned(s[2]) << 16;
        case 2 : a += char2unsigned(s[1]) << 8;
        case 1 : a += char2unsigned(s[0]);
      }
    } else {
      DCHECK(sizeof(a) <= keylen && keylen < 3 * sizeof(a));
      c += len;
      switch ( keylen ) {           // deal with rest.  Cases fall through
        case 11: c += char2unsigned(s[10]) << 24;
        case 10: c += char2unsigned(s[9]) << 16;
        case 9 : c += char2unsigned(s[8]) << 8;
        case 8 : b += Google1At(s+4);  a += word32AtOffset0;  break;
        case 7 : b += char2unsigned(s[6]) << 16;
        case 6 : b += char2unsigned(s[5]) << 8;
        case 5 : b += char2unsigned(s[4]);
        case 4 : a += word32AtOffset0;  break;
      }
    }
  } else {
    if (keylen >= 3 * sizeof(a)) {
      a += Google1At(s);
      b += Google1At(s + sizeof(a));
      c += Google1At(s + sizeof(a) * 2);
      s += 3 * sizeof(a);
      mix(a, b, c);
      keylen -= 3 * static_cast<uint32>(sizeof(a));
    }
    c += len;
    switch ( keylen ) {           // deal with rest.  Cases fall through
      case 11: c += char2unsigned(s[10]) << 24;
      case 10: c += char2unsigned(s[9]) << 16;
      case 9 : c += char2unsigned(s[8]) << 8;
      case 8 : b += Google1At(s+4);  a += Google1At(s);  break;
      case 7 : b += char2unsigned(s[6]) << 16;
      case 6 : b += char2unsigned(s[5]) << 8;
      case 5 : b += char2unsigned(s[4]);
      case 4 : a += Google1At(s);  break;
      case 3 : a += char2unsigned(s[2]) << 16;
      case 2 : a += char2unsigned(s[1]) << 8;
      case 1 : a += char2unsigned(s[0]);
    }
  }
  mix(a, b, c);
  return c;
}