src/share/classes/sun/misc/Hashing.java
Print this page
rev 5810 : 8006593: Performance and compatibility improvements to hash based Map implementations.
Summary: Use ThreadLocalRandom for hash seed rather than shared Random. Initialize {HashMap|Hashtable}.hashSeed only as needed. Minor optimizations.
Reviewed-by: alanb, bchristi
*** 22,32 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.misc;
! import java.util.Random;
/**
* Hashing utilities.
*
* Little endian implementations of Murmur3 hashing.
--- 22,32 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.misc;
! import java.util.concurrent.ThreadLocalRandom;
/**
* Hashing utilities.
*
* Little endian implementations of Murmur3 hashing.
*** 211,232 ****
* is fully booted.
*/
private static class Holder {
/**
- * Used for generating per-instance hash seeds.
- *
- * We try to improve upon the default seeding.
- */
- static final Random SEED_MAKER = new Random(
- Double.doubleToRawLongBits(Math.random())
- ^ System.identityHashCode(Hashing.class)
- ^ System.currentTimeMillis()
- ^ System.nanoTime()
- ^ Runtime.getRuntime().freeMemory());
-
- /**
* Access to {@code String.hash32()}
*/
static final JavaLangAccess LANG_ACCESS;
static {
--- 211,220 ----
*** 246,259 ****
*/
public static int stringHash32(String string) {
return Holder.LANG_ACCESS.getStringHash32(string);
}
public static int randomHashSeed(Object instance) {
int seed;
if (sun.misc.VM.isBooted()) {
! seed = Holder.SEED_MAKER.nextInt();
} else {
// lower quality "random" seed value--still better than zero and not
// not practically reversible.
int hashing_seed[] = {
System.identityHashCode(Hashing.class),
--- 234,254 ----
*/
public static int stringHash32(String string) {
return Holder.LANG_ACCESS.getStringHash32(string);
}
+ /**
+ * Return a non-zero 32-bit pseudo random value. The {@code instance} object
+ * may be used as part of the value.
+ *
+ * @param instance an object to use if desired in choosing value.
+ * @return a non-zero 32-bit pseudo random value.
+ */
public static int randomHashSeed(Object instance) {
int seed;
if (sun.misc.VM.isBooted()) {
! seed = ThreadLocalRandom.current().nextInt();
} else {
// lower quality "random" seed value--still better than zero and not
// not practically reversible.
int hashing_seed[] = {
System.identityHashCode(Hashing.class),