diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/FileNameCache.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/FileNameCache.java index 1afa309b3a94..a13998cf67bc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/FileNameCache.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/FileNameCache.java @@ -57,12 +57,24 @@ public class FileNameCache { Object rawName = convertToBytesIfAsciiString(name); IntObjectLinkedMap.MapEntry entry = new IntObjectLinkedMap.MapEntry(id, rawName); - final int stripe = id % ourNameCache.length; + final int stripe = calcStripeIdFromNameId(id); synchronized (ourNameCache[stripe]) { return ourNameCache[stripe].cacheEntry(entry); } } + private static int calcStripeIdFromNameId(int id) { + int h = id; + h -= (h<<6); + h ^= (h>>17); + h -= (h<<9); + h ^= (h<<4); + h -= (h<<3); + h ^= (h<<10); + h ^= (h>>15); + return h % ourNameCache.length; + } + private static Object convertToBytesIfAsciiString(@NotNull String name) { int length = name.length(); if (length == 0) return EMPTY; @@ -80,7 +92,7 @@ public class FileNameCache { @NotNull private static IntObjectLinkedMap.MapEntry getEntry(int id) { - final int stripe = id % ourNameCache.length; + final int stripe = calcStripeIdFromNameId(id); synchronized (ourNameCache[stripe]) { IntObjectLinkedMap.MapEntry entry = ourNameCache[stripe].getCachedEntry(id); if (entry != null) {