public static int murmur(CharSequence data, int seed) {
    final int length = data.length();
    // 'm' and 'r' are mixing constants generated offline.
    // They're not really 'magic', they just happen to work well.
    final int m = 0x5bd1e995;
    final int r = 24;
    // Initialize the hash to a random value
    int h = seed ^ length;
    int length4 = length >> 2;

    for (int i = 0; i < length4; i++) {
      final int i4 = i << 2;
      int k = data.charAt(i4) + (data.charAt(i4 + 1) << 8) +
              (data.charAt(i4 + 2) << 16) + (data.charAt(i4 + 3) << 24);
      k *= m;
      k ^= k >>> r;
      k *= m;
      h *= m;
      h ^= k;
    }

    // Handle the last few bytes of the input array
    switch (length % 4) {
      case 3:
        h ^= data.charAt((length & ~3) + 2) << 16;
      case 2:
        h ^= data.charAt((length & ~3) + 1) << 8;
      case 1:
        h ^= data.charAt(length & ~3);
        h *= m;
    }

    h ^= h >>> 13;
    h *= m;
    h ^= h >>> 15;

    return h;
  }
public static int murmur(CharSequence data, int seed)