@Beta @Immutable public interface HashFunction
Unpacking this definition:
Hasher), but this is merely a convenience; these are always translated into raw
       byte sequences under the covers.
   bits()). For example, Hashing.sha1() produces a 160-bit number,
       while Hashing.murmur3_32() yields only 32 bits. Because a long value is
       clearly insufficient to hold all hash code values, this API represents a hash code as an
       instance of HashCode.
   HashFunction instances should always be
       stateless, and therefore thread-safe.
   Summarizing the last two points: "equal yield equal always; unequal yield unequal often." This is the most important characteristic of all hash functions.
A high-quality hash function strives for some subset of the following virtues:
Hashing.sha512() are designed to
       make it as infeasible as possible to reverse-engineer the input that produced a given hash
       code, or even to discover any two distinct inputs that yield the same result. These
       are called cryptographic hash functions. But, whenever it is learned that either of
       these feats has become computationally feasible, the function is deemed "broken" and should
       no longer be used for secure purposes. (This is the likely eventual fate of all
       cryptographic hashes.)
   The primary way to provide the data that your hash function should act on is via a Hasher. Obtain a new hasher from the hash function using newHasher(), "push" the relevant
 data into it using methods like Hasher.putBytes(byte[]), and finally ask for the HashCode when finished using Hasher.hash(). (See an example of
 this.)
 
If all you want to hash is a single byte array, string or long value, there are
 convenient shortcut methods defined directly on HashFunction to make this easier.
 
Hasher accepts primitive data types, but can also accept any Object of type T provided
 that you implement a Funnel<T> to specify how to "feed" data from that object
 into the function. (See an example of this.)
 
Compatibility note: Throughout this API, multibyte values are always interpreted in
 little-endian order. That is, hashing the byte array {0x01, 0x02, 0x03, 0x04} is
 equivalent to hashing the int value 0x04030201. If this isn't what you need,
 methods such as Integer.reverseBytes(int) and Ints.toByteArray(int) will help.
 
Object.hashCode()Java's baked-in concept of hash codes is constrained to 32 bits, and provides no separation
 between hash algorithms and the data they act on, so alternate hash algorithms can't be easily
 substituted. Also, implementations of hashCode tend to be poor-quality, in part because
 they end up depending on other existing poor-quality hashCode implementations,
 including those in many JDK classes.
 
Object.hashCode implementations tend to be very fast, but have weak collision
 prevention and no expectation of bit dispersion. This leaves them perfectly suitable for
 use in hash tables, because extra collisions cause only a slight performance hit, while poor bit
 dispersion is easily corrected using a secondary hash function (which all reasonable hash table
 implementations in Java use). For the many uses of hash functions beyond data structures,
 however, Object.hashCode almost always falls short -- hence this library.
| Modifier and Type | Method and Description | 
|---|---|
int | 
bits()
Returns the number of bits (a multiple of 32) that each hash code produced by this hash
 function has. 
 | 
HashCode | 
hashBytes(byte[] input)
Shortcut for  
newHasher().putBytes(input).hash(). | 
HashCode | 
hashBytes(byte[] input,
         int off,
         int len)
Shortcut for  
newHasher().putBytes(input, off, len).hash(). | 
HashCode | 
hashBytes(ByteBuffer input)
Shortcut for  
newHasher().putBytes(input).hash(). | 
HashCode | 
hashInt(int input)
Shortcut for  
newHasher().putInt(input).hash(); returns the hash code for the given
 int value, interpreted in little-endian byte order. | 
HashCode | 
hashLong(long input)
Shortcut for  
newHasher().putLong(input).hash(); returns the hash code for the given
 long value, interpreted in little-endian byte order. | 
<T> HashCode | 
hashObject(T instance,
          Funnel<? super T> funnel)
Shortcut for  
newHasher().putObject(instance, funnel).hash(). | 
HashCode | 
hashString(CharSequence input,
          Charset charset)
Shortcut for  
newHasher().putString(input, charset).hash(). | 
HashCode | 
hashUnencodedChars(CharSequence input)
Shortcut for  
newHasher().putUnencodedChars(input).hash(). | 
Hasher | 
newHasher()
Begins a new hash code computation by returning an initialized, stateful  
Hasher
 instance that is ready to receive data. | 
Hasher | 
newHasher(int expectedInputSize)
Begins a new hash code computation as  
newHasher(), but provides a hint of the expected
 size of the input (in bytes). | 
Hasher newHasher()
Hasher
 instance that is ready to receive data. Example:
 
 HashFunction hf = Hashing.md5();
 HashCode hc = hf.newHasher()
     .putLong(id)
     .putBoolean(isActive)
     .hash();
 Hasher newHasher(int expectedInputSize)
newHasher(), but provides a hint of the expected
 size of the input (in bytes). This is only important for non-streaming hash functions (hash
 functions that need to buffer their whole input before processing any of it).HashCode hashInt(int input)
newHasher().putInt(input).hash(); returns the hash code for the given
 int value, interpreted in little-endian byte order. The implementation might
 perform better than its longhand equivalent, but should not perform worse.HashCode hashLong(long input)
newHasher().putLong(input).hash(); returns the hash code for the given
 long value, interpreted in little-endian byte order. The implementation might
 perform better than its longhand equivalent, but should not perform worse.HashCode hashBytes(byte[] input)
newHasher().putBytes(input).hash(). The implementation might
 perform better than its longhand equivalent, but should not perform worse.HashCode hashBytes(byte[] input, int off, int len)
newHasher().putBytes(input, off, len).hash(). The implementation
 might perform better than its longhand equivalent, but should not perform worse.IndexOutOfBoundsException - if off < 0 or off + len > bytes.length or
     len < 0HashCode hashBytes(ByteBuffer input)
newHasher().putBytes(input).hash(). The implementation might
 perform better than its longhand equivalent, but should not perform worse.HashCode hashUnencodedChars(CharSequence input)
newHasher().putUnencodedChars(input).hash(). The implementation
 might perform better than its longhand equivalent, but should not perform worse. Note
 that no character encoding is performed; the low byte and high byte of each char are
 hashed directly (in that order).
 Warning: This method will produce different output than most other languages do when
 running the same hash function on the equivalent input. For cross-language compatibility, use
 hashString(java.lang.CharSequence, java.nio.charset.Charset), usually with a charset of UTF-8. For other use cases, use hashUnencodedChars.
HashCode hashString(CharSequence input, Charset charset)
newHasher().putString(input, charset).hash(). Characters are encoded using
 the given Charset. The implementation might perform better than its longhand
 equivalent, but should not perform worse.
 Warning: This method, which reencodes the input before hashing it, is useful only for
 cross-language compatibility. For other use cases, prefer hashUnencodedChars(java.lang.CharSequence), which is
 faster, produces the same output across Java releases, and hashes every char in the
 input, even if some are invalid.
<T> HashCode hashObject(T instance, Funnel<? super T> funnel)
newHasher().putObject(instance, funnel).hash(). The implementation
 might perform better than its longhand equivalent, but should not perform worse.int bits()
Copyright © 2010–2018. All rights reserved.