public static long generate(long hash,final CharSequence value){
  final long m=0xc6a4a7935bd1e995L;
  final int r=47;
  int strlen=value.length();
  int length=2 * strlen;
  hash^=length * m;
  int len4=strlen / 4;
  int offset=0;
  for (int i=0; i < len4; i++) {
    final int index=i * 4 + offset;
    long k=(value.charAt(index + 0) | ((long)value.charAt(index + 1) << 16) | ((long)value.charAt(index + 2) << 32)| ((long)value.charAt(index + 3) << 48));
    k*=m;
    k^=k >>> r;
    k*=m;
    hash^=k;
    hash*=m;
  }
  final int off=offset + (strlen & ~0x3);
switch (strlen % 4) {
case 3:
    hash^=(long)value.charAt(off + 2) << 48;
case 2:
  hash^=(long)value.charAt(off + 1) << 32;
case 1:
hash^=(long)value.charAt(off + 0) << 16;
hash*=m;
}
hash^=hash >>> r;
hash*=m;
hash^=hash >>> r;
return hash;
}

public static long generate ( long hash , final CharSequence value ) { final long m = 0xc6a4a7935bd1e995L ; final int r = 47 ; int strlen = value . length ( ) ; int length = 2 * strlen ; hash ^= length * m ; int len4 = strlen / 4 ; int offset = 0 ; for ( int i = 0 ; i < len4 ; i ++ ) { final int index = i * 4 + offset ; long k = ( value . charAt ( index + 0 ) | ( ( long ) value . charAt ( index + 1 ) << 16 ) | ( ( long ) value . charAt ( index + 2 ) << 32 ) | ( ( long ) value . charAt ( index + 3 ) << 48 ) ) ; k *= m ; k ^= k > > > r ; k *= m ; hash ^= k ; hash *= m ; } final int off = offset + ( strlen & ~ 0x3 ) ; switch ( strlen % 4 ) { case 3 : hash ^= ( long ) value . charAt ( off + 2 ) << 48 ; case 2 : hash ^= ( long ) value . charAt ( off + 1 ) << 32 ; case 1 : hash ^= ( long ) value . charAt ( off + 0 ) << 16 ; hash *= m ; } hash ^= hash > > > r ; hash *= m ; hash ^= hash > > > r ; return hash ; }
calculates hash from a string , using utf - 16 encoding
