summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clr.coreclr.props1
-rw-r--r--clr.defines.targets1
-rw-r--r--clrdefinitions.cmake1
-rw-r--r--crossgen.cmake1
-rw-r--r--src/classlibnative/bcltype/stringnative.cpp21
-rw-r--r--src/classlibnative/bcltype/stringnative.h5
-rw-r--r--src/classlibnative/inc/nlsinfo.h2
-rw-r--r--src/classlibnative/nls/nlsinfo.cpp4
-rw-r--r--src/inc/MSCOREE.IDL2
-rw-r--r--src/inc/clrconfigvalues.h3
-rw-r--r--src/mscorlib/src/System/AppDomainSetup.cs18
-rw-r--r--src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs4
-rw-r--r--src/mscorlib/src/System/Collections/Generic/Dictionary.cs17
-rw-r--r--src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs5
-rw-r--r--src/mscorlib/src/System/Collections/Hashtable.cs3
-rw-r--r--src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs16
-rw-r--r--src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs4
-rw-r--r--src/mscorlib/src/System/String.Comparison.cs24
-rw-r--r--src/pal/prebuilt/inc/mscoree.h2
-rw-r--r--src/vm/appdomain.cpp6
-rw-r--r--src/vm/comutilnative.cpp201
-rw-r--r--src/vm/comutilnative.h17
-rw-r--r--src/vm/crossgen_mscorlib/CMakeLists.txt1
-rw-r--r--src/vm/ecalllist.h3
-rw-r--r--src/vm/mscorlib.h3
-rw-r--r--src/vm/object.h4
26 files changed, 38 insertions, 331 deletions
diff --git a/clr.coreclr.props b/clr.coreclr.props
index 4a71b0a046..6d3538c341 100644
--- a/clr.coreclr.props
+++ b/clr.coreclr.props
@@ -45,7 +45,6 @@
<FeatureCominteropWinRTManagedActivation>true</FeatureCominteropWinRTManagedActivation>
<FeatureLazyCOWPages Condition="('$(TargetArch)' == 'i386') or ('$(TargetArch)' == 'arm')">true</FeatureLazyCOWPages>
<FeatureLegacyNetCFDbgHostControl>true</FeatureLegacyNetCFDbgHostControl>
- <FeatureRandomizedStringHashing>true</FeatureRandomizedStringHashing>
<!-- The rejit feature is available only on supported architectures (x86 & x64) -->
<FeatureReJIT Condition="('$(TargetArch)' == 'i386') or ('$(TargetArch)' == 'amd64')">true</FeatureReJIT>
<FeatureManagedEtw>false</FeatureManagedEtw>
diff --git a/clr.defines.targets b/clr.defines.targets
index b59dc75459..64ff2e0870 100644
--- a/clr.defines.targets
+++ b/clr.defines.targets
@@ -25,7 +25,6 @@
<DefineConstants Condition="'$(FeaturePathCompat)' == 'true'">$(DefineConstants);FEATURE_PATHCOMPAT</DefineConstants>
<DefineConstants Condition="'$(FeaturePerfTracing)' == 'true'">$(DefineConstants);FEATURE_PERFTRACING</DefineConstants>
<DefineConstants Condition="'$(FeatureXplatEventSource)' == 'true'">$(DefineConstants);FEATURE_EVENTSOURCE_XPLAT</DefineConstants>
- <DefineConstants Condition="'$(FeatureRandomizedStringHashing)' == 'true'">$(DefineConstants);FEATURE_RANDOMIZED_STRING_HASHING</DefineConstants>
<DefineConstants Condition="'$(FeatureSortTables)' == 'true'">$(DefineConstants);FEATURE_SORT_TABLES</DefineConstants>
<DefineConstants Condition="'$(FeatureTypeEquivalence)' == 'true'">$(DefineConstants);FEATURE_TYPEEQUIVALENCE</DefineConstants>
<DefineConstants Condition="'$(FeatureUseLcid)' == 'true'">$(DefineConstants);FEATURE_USE_LCID</DefineConstants>
diff --git a/clrdefinitions.cmake b/clrdefinitions.cmake
index 4f6b0414bb..c6f4ad67eb 100644
--- a/clrdefinitions.cmake
+++ b/clrdefinitions.cmake
@@ -169,7 +169,6 @@ if(CLR_CMAKE_PLATFORM_LINUX)
add_definitions(-DFEATURE_PERFMAP)
endif(CLR_CMAKE_PLATFORM_LINUX)
add_definitions(-DFEATURE_PREJIT)
-add_definitions(-DFEATURE_RANDOMIZED_STRING_HASHING)
add_definitions(-DFEATURE_READYTORUN)
set(FEATURE_READYTORUN 1)
diff --git a/crossgen.cmake b/crossgen.cmake
index 307f05cdf0..75739dfc73 100644
--- a/crossgen.cmake
+++ b/crossgen.cmake
@@ -13,7 +13,6 @@ remove_definitions(
-DFEATURE_LOADER_OPTIMIZATION
-DFEATURE_MULTICOREJIT
-DFEATURE_PERFMAP
- -DFEATURE_RANDOMIZED_STRING_HASHING
-DFEATURE_REJIT
-DFEATURE_TIERED_COMPILATION
-DFEATURE_VERSIONING_LOG
diff --git a/src/classlibnative/bcltype/stringnative.cpp b/src/classlibnative/bcltype/stringnative.cpp
index 1a92e04815..34fbf1eb34 100644
--- a/src/classlibnative/bcltype/stringnative.cpp
+++ b/src/classlibnative/bcltype/stringnative.cpp
@@ -155,15 +155,13 @@ FCIMPL4(Object *, COMString::StringInitCharPtrPartial, StringObject *stringThis,
}
FCIMPLEND
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
-
inline COMNlsHashProvider * GetCurrentNlsHashProvider()
{
LIMITED_METHOD_CONTRACT;
return &COMNlsHashProvider::s_NlsHashProvider;
}
-FCIMPL3(INT32, COMString::Marvin32HashString, StringObject* thisRefUNSAFE, INT32 strLen, INT64 additionalEntropy) {
+FCIMPL1(INT32, COMString::Marvin32HashString, StringObject* thisRefUNSAFE) {
FCALL_CONTRACT;
int iReturnHash = 0;
@@ -173,7 +171,7 @@ FCIMPL3(INT32, COMString::Marvin32HashString, StringObject* thisRefUNSAFE, INT32
}
BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException));
- iReturnHash = GetCurrentNlsHashProvider()->HashString(thisRefUNSAFE->GetBuffer(), thisRefUNSAFE->GetStringLength(), TRUE, additionalEntropy);
+ iReturnHash = GetCurrentNlsHashProvider()->HashString(thisRefUNSAFE->GetBuffer(), thisRefUNSAFE->GetStringLength());
END_SO_INTOLERANT_CODE;
FC_GC_POLL_RET();
@@ -182,21 +180,6 @@ FCIMPL3(INT32, COMString::Marvin32HashString, StringObject* thisRefUNSAFE, INT32
}
FCIMPLEND
-BOOL QCALLTYPE COMString::UseRandomizedHashing() {
- QCALL_CONTRACT;
-
- BOOL bUseRandomizedHashing = FALSE;
-
- BEGIN_QCALL;
-
- bUseRandomizedHashing = GetCurrentNlsHashProvider()->GetUseRandomHashing();
-
- END_QCALL;
-
- return bUseRandomizedHashing;
-}
-#endif
-
/*===============================IsFastSort===============================
**Action: Call the helper to walk the string and see if we have any high chars.
**Returns: void. The appropriate bits are set on the String.
diff --git a/src/classlibnative/bcltype/stringnative.h b/src/classlibnative/bcltype/stringnative.h
index a4d962df6d..a8409826c6 100644
--- a/src/classlibnative/bcltype/stringnative.h
+++ b/src/classlibnative/bcltype/stringnative.h
@@ -85,10 +85,7 @@ public:
static FCDECL2(VOID, FCSetTrailByte, StringObject* thisRefUNSAFE, UINT8 bData);
#endif // FEATURE_COMINTEROP
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- static FCDECL3(INT32, Marvin32HashString, StringObject* thisRefUNSAFE, INT32 strLen, INT64 additionalEntropy);
- static BOOL QCALLTYPE UseRandomizedHashing();
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
+ static FCDECL1(INT32, Marvin32HashString, StringObject* thisRefUNSAFE);
};
diff --git a/src/classlibnative/inc/nlsinfo.h b/src/classlibnative/inc/nlsinfo.h
index 505827bc90..0593a4f034 100644
--- a/src/classlibnative/inc/nlsinfo.h
+++ b/src/classlibnative/inc/nlsinfo.h
@@ -54,7 +54,7 @@ public:
// Native helper functions for CultureData
//
- static INT32 QCALLTYPE InternalGetGlobalizedHashCode(INT_PTR handle, LPCWSTR localeName, LPCWSTR pString, INT32 length, INT32 dwFlagsIn, INT64 additionalEntropy);
+ static INT32 QCALLTYPE InternalGetGlobalizedHashCode(INT_PTR handle, LPCWSTR localeName, LPCWSTR pString, INT32 length, INT32 dwFlagsIn);
//
// Native helper function for methods in EncodingTable
diff --git a/src/classlibnative/nls/nlsinfo.cpp b/src/classlibnative/nls/nlsinfo.cpp
index fa288c0e0a..053bb14a65 100644
--- a/src/classlibnative/nls/nlsinfo.cpp
+++ b/src/classlibnative/nls/nlsinfo.cpp
@@ -91,7 +91,7 @@ INT32 COMNlsInfo::CallGetUserDefaultUILanguage()
// InternalGetGlobalizedHashCode
//
////////////////////////////////////////////////////////////////////////////
-INT32 QCALLTYPE COMNlsInfo::InternalGetGlobalizedHashCode(INT_PTR handle, LPCWSTR localeName, LPCWSTR string, INT32 length, INT32 dwFlagsIn, INT64 additionalEntropy)
+INT32 QCALLTYPE COMNlsInfo::InternalGetGlobalizedHashCode(INT_PTR handle, LPCWSTR localeName, LPCWSTR string, INT32 length, INT32 dwFlagsIn)
{
CONTRACTL
{
@@ -140,7 +140,7 @@ INT32 QCALLTYPE COMNlsInfo::InternalGetGlobalizedHashCode(INT_PTR handle, LPCWST
NewApis::LCMapStringEx(handle != NULL ? NULL : localeName, dwFlags, string, length, (LPWSTR)pByte, byteCount, NULL,NULL, (LPARAM) handle);
}
- iReturnHash = COMNlsHashProvider::s_NlsHashProvider.HashSortKey(pByte, byteCount, true, additionalEntropy);
+ iReturnHash = COMNlsHashProvider::s_NlsHashProvider.HashSortKey(pByte, byteCount);
}
END_QCALL;
return(iReturnHash);
diff --git a/src/inc/MSCOREE.IDL b/src/inc/MSCOREE.IDL
index 53d4ce3bb0..a6b60b9278 100644
--- a/src/inc/MSCOREE.IDL
+++ b/src/inc/MSCOREE.IDL
@@ -164,7 +164,7 @@ typedef enum {
STARTUP_ARM = 0x400000, // Enable the ARM feature.
STARTUP_SINGLE_APPDOMAIN = 0x800000, // application runs in default domain, no more domains are created
STARTUP_APPX_APP_MODEL = 0x1000000, // jupiter app
- STARTUP_DISABLE_RANDOMIZED_STRING_HASHING = 0x2000000 // Disable the randomized string hashing
+ STARTUP_DISABLE_RANDOMIZED_STRING_HASHING = 0x2000000 // Disable the randomized string hashing (not supported)
} STARTUP_FLAGS;
typedef enum {
diff --git a/src/inc/clrconfigvalues.h b/src/inc/clrconfigvalues.h
index f385119c31..1e27c729f8 100644
--- a/src/inc/clrconfigvalues.h
+++ b/src/inc/clrconfigvalues.h
@@ -164,9 +164,6 @@ RETAIL_CONFIG_DWORD_INFO(EXTERNAL_NetFx45_LegacyManagedDeflateStream, W("NetFx45
RETAIL_CONFIG_DWORD_INFO(EXTERNAL_DateTime_NetFX35ParseMode, W("DateTime_NetFX35ParseMode"), 0, "Flag to enable the .NET 3.5 System.DateTime Token Replacement Policy")
RETAIL_CONFIG_DWORD_INFO(EXTERNAL_ThrowUnobservedTaskExceptions, W("ThrowUnobservedTaskExceptions"), 0, "Flag to propagate unobserved task exceptions on the finalizer thread.")
RETAIL_CONFIG_DWORD_INFO(EXTERNAL_DateTime_NetFX40AmPmParseAdjustment, W("EnableAmPmParseAdjustment"), 0, "Flag to enable the .NET 4.0 DateTimeParse to correctly parse AM/PM cases")
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
-RETAIL_CONFIG_DWORD_INFO(EXTERNAL_UseRandomizedStringHashAlgorithm, W("UseRandomizedStringHashAlgorithm"), 0, "Flag to use a string hashing algorithm who's behavior differs between AppDomains")
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
//
// Conditional breakpoints
diff --git a/src/mscorlib/src/System/AppDomainSetup.cs b/src/mscorlib/src/System/AppDomainSetup.cs
index 6b1b329196..d0fdf4e725 100644
--- a/src/mscorlib/src/System/AppDomainSetup.cs
+++ b/src/mscorlib/src/System/AppDomainSetup.cs
@@ -63,10 +63,6 @@ namespace System
// to an AppDomain. We only use the keys, the values are ignored.
private Dictionary<string, object> _CompatFlags;
-#if FEATURE_RANDOMIZED_STRING_HASHING
- private bool _UseRandomizedStringHashing;
-#endif
-
internal AppDomainSetup(AppDomainSetup copy, bool copyDomainBoundData)
{
string[] mine = Value;
@@ -92,11 +88,6 @@ namespace System
{
SetCompatibilitySwitches(copy._CompatFlags.Keys);
}
-
-#if FEATURE_RANDOMIZED_STRING_HASHING
- _UseRandomizedStringHashing = copy._UseRandomizedStringHashing;
-#endif
-
}
}
@@ -157,20 +148,11 @@ namespace System
public void SetCompatibilitySwitches(IEnumerable<String> switches)
{
-#if FEATURE_RANDOMIZED_STRING_HASHING
- _UseRandomizedStringHashing = false;
-#endif
if (switches != null)
{
_CompatFlags = new Dictionary<string, object>();
foreach (String str in switches)
{
-#if FEATURE_RANDOMIZED_STRING_HASHING
- if (StringComparer.OrdinalIgnoreCase.Equals("UseRandomizedStringHashAlgorithm", str))
- {
- _UseRandomizedStringHashing = true;
- }
-#endif
_CompatFlags.Add(str, null);
}
}
diff --git a/src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs b/src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs
index 436808c439..b664520cf1 100644
--- a/src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs
+++ b/src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs
@@ -636,11 +636,7 @@ namespace System.Collections.Concurrent
//
if (resizeDesired)
{
-#if FEATURE_RANDOMIZED_STRING_HASHING
GrowTable(tables, tables.m_comparer, false, m_keyRehashCount);
-#else
- GrowTable(tables, tables.m_comparer, false, m_keyRehashCount);
-#endif
}
resultingValue = value;
diff --git a/src/mscorlib/src/System/Collections/Generic/Dictionary.cs b/src/mscorlib/src/System/Collections/Generic/Dictionary.cs
index 50724017dd..0a83734eb0 100644
--- a/src/mscorlib/src/System/Collections/Generic/Dictionary.cs
+++ b/src/mscorlib/src/System/Collections/Generic/Dictionary.cs
@@ -92,12 +92,10 @@ namespace System.Collections.Generic
if (capacity > 0) Initialize(capacity);
this.comparer = comparer ?? EqualityComparer<TKey>.Default;
-#if FEATURE_RANDOMIZED_STRING_HASHING
- if (HashHelpers.s_UseRandomizedStringHashing && this.comparer == EqualityComparer<string>.Default)
+ if (this.comparer == EqualityComparer<string>.Default)
{
this.comparer = (IEqualityComparer<TKey>)NonRandomizedStringEqualityComparer.Default;
}
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
}
public Dictionary(IDictionary<TKey, TValue> dictionary) : this(dictionary, null) { }
@@ -408,9 +406,7 @@ namespace System.Collections.Generic
if (buckets == null) Initialize(0);
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
int targetBucket = hashCode % buckets.Length;
-#if FEATURE_RANDOMIZED_STRING_HASHING
int collisionCount = 0;
-#endif
for (int i = buckets[targetBucket]; i >= 0; i = entries[i].next)
{
@@ -430,9 +426,8 @@ namespace System.Collections.Generic
return false;
}
-#if FEATURE_RANDOMIZED_STRING_HASHING
+
collisionCount++;
-#endif
}
int index;
if (freeCount > 0)
@@ -459,18 +454,14 @@ namespace System.Collections.Generic
buckets[targetBucket] = index;
version++;
-#if FEATURE_RANDOMIZED_STRING_HASHING
- // In case we hit the collision threshold we'll need to switch to the comparer which is using randomized string hashing
- // in this case will be EqualityComparer<string>.Default.
- // Note, randomized string hashing is turned on by default on coreclr so EqualityComparer<string>.Default will
- // be using randomized string hashing
+ // If we hit the collision threshold we'll need to switch to the comparer which is using randomized string hashing
+ // i.e. EqualityComparer<string>.Default.
if (collisionCount > HashHelpers.HashCollisionThreshold && comparer == NonRandomizedStringEqualityComparer.Default)
{
comparer = (IEqualityComparer<TKey>)EqualityComparer<string>.Default;
Resize(entries.Length, true);
}
-#endif
return true;
}
diff --git a/src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs b/src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs
index 760c9d10b2..4427682d38 100644
--- a/src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs
+++ b/src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs
@@ -272,11 +272,8 @@ namespace System.Collections.Generic
GetType().GetHashCode();
}
- // NonRandomizedStringEqualityComparer is the comparer used by default with the Dictionary<string,...>
- // As the randomized string hashing is turned on by default on coreclr, we need to keep the performance not affected
- // as much as possible in the main stream scenarios like Dictionary<string,>
// We use NonRandomizedStringEqualityComparer as default comparer as it doesnt use the randomized string hashing which
- // keep the perofrmance not affected till we hit collision threshold and then we switch to the comparer which is using
+ // keeps the performance unaffected till we hit collision threshold and then we switch to the comparer which is using
// randomized string hashing GenericEqualityComparer<string>
[Serializable]
[System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
diff --git a/src/mscorlib/src/System/Collections/Hashtable.cs b/src/mscorlib/src/System/Collections/Hashtable.cs
index 0c89632828..fcfcc3bbd6 100644
--- a/src/mscorlib/src/System/Collections/Hashtable.cs
+++ b/src/mscorlib/src/System/Collections/Hashtable.cs
@@ -1392,10 +1392,7 @@ namespace System.Collections
[FriendAccessAllowed]
internal static class HashHelpers
{
-#if FEATURE_RANDOMIZED_STRING_HASHING
public const int HashCollisionThreshold = 100;
- public static bool s_UseRandomizedStringHashing = String.UseRandomizedHashing();
-#endif
// Table of prime numbers to use as hash table sizes.
// A typical resize algorithm would pick the smallest prime number in this array
diff --git a/src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs b/src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs
index e58a78ee67..92fd691c8b 100644
--- a/src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs
+++ b/src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs
@@ -137,14 +137,6 @@ namespace System.Globalization
return -1;
}
- private int GetHashCodeOfStringCore(string source, CompareOptions options)
- {
- Debug.Assert(source != null);
- Debug.Assert((options & (CompareOptions.Ordinal | CompareOptions.OrdinalIgnoreCase)) == 0);
-
- return GetHashCodeOfStringCore(source, options, forceRandomizedHashing: false, additionalEntropy: 0);
- }
-
private static unsafe int CompareStringOrdinalIgnoreCase(char* string1, int count1, char* string2, int count2)
{
Debug.Assert(!GlobalizationMode.Invariant);
@@ -357,7 +349,7 @@ namespace System.Globalization
// ---- PAL layer ends here ----
// -----------------------------
- internal unsafe int GetHashCodeOfStringCore(string source, CompareOptions options, bool forceRandomizedHashing, long additionalEntropy)
+ internal unsafe int GetHashCodeOfStringCore(string source, CompareOptions options)
{
Debug.Assert(!_invariantMode);
@@ -376,7 +368,7 @@ namespace System.Globalization
{
byte* pSortKey = stackalloc byte[sortKeyLength];
Interop.GlobalizationInterop.GetSortKey(_sortHandle, source, source.Length, pSortKey, sortKeyLength, options);
- return InternalHashSortKey(pSortKey, sortKeyLength, false, additionalEntropy);
+ return InternalHashSortKey(pSortKey, sortKeyLength);
}
byte[] sortKey = new byte[sortKeyLength];
@@ -384,13 +376,13 @@ namespace System.Globalization
fixed (byte* pSortKey = sortKey)
{
Interop.GlobalizationInterop.GetSortKey(_sortHandle, source, source.Length, pSortKey, sortKeyLength, options);
- return InternalHashSortKey(pSortKey, sortKeyLength, false, additionalEntropy);
+ return InternalHashSortKey(pSortKey, sortKeyLength);
}
}
[DllImport(JitHelpers.QCall)]
[SuppressUnmanagedCodeSecurity]
- private static unsafe extern int InternalHashSortKey(byte* sortKey, int sortKeyLength, [MarshalAs(UnmanagedType.Bool)] bool forceRandomizedHashing, long additionalEntropy);
+ private static unsafe extern int InternalHashSortKey(byte* sortKey, int sortKeyLength);
private static CompareOptions GetOrdinalCompareOptions(CompareOptions options)
{
diff --git a/src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs b/src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs
index 0df5463a2f..2bfe15b835 100644
--- a/src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs
+++ b/src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs
@@ -92,7 +92,7 @@ namespace System.Globalization
int flags = GetNativeCompareFlags(options);
int tmpHash = 0;
#if CORECLR
- tmpHash = InternalGetGlobalizedHashCode(_sortHandle, _sortName, source, source.Length, flags, 0);
+ tmpHash = InternalGetGlobalizedHashCode(_sortHandle, _sortName, source, source.Length, flags);
#else
fixed (char* pSource = source)
{
@@ -481,7 +481,7 @@ namespace System.Globalization
// Get a locale sensitive sort hash code from native code -- COMNlsInfo::InternalGetGlobalizedHashCode
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
[SuppressUnmanagedCodeSecurity]
- private static extern int InternalGetGlobalizedHashCode(IntPtr handle, string localeName, string source, int length, int dwFlags, long additionalEntropy);
+ private static extern int InternalGetGlobalizedHashCode(IntPtr handle, string localeName, string source, int length, int dwFlags);
#endif
}
}
diff --git a/src/mscorlib/src/System/String.Comparison.cs b/src/mscorlib/src/System/String.Comparison.cs
index 57b3f53931..782ab2775f 100644
--- a/src/mscorlib/src/System/String.Comparison.cs
+++ b/src/mscorlib/src/System/String.Comparison.cs
@@ -1002,34 +1002,14 @@ namespace System
return !String.Equals(a, b);
}
-#if FEATURE_RANDOMIZED_STRING_HASHING
- // Do not remove!
- // This method is called by reflection in System.Xml
[MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal static extern int InternalMarvin32HashString(string s, int strLen, long additionalEntropy);
-
- internal static bool UseRandomizedHashing()
- {
- return InternalUseRandomizedHashing();
- }
-
- [System.Security.SuppressUnmanagedCodeSecurity]
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- private static extern bool InternalUseRandomizedHashing();
-#endif
+ private static extern int InternalMarvin32HashString(string s);
// Gets a hash code for this string. If strings A and B are such that A.Equals(B), then
// they will return the same hash code.
public override int GetHashCode()
{
-#if FEATURE_RANDOMIZED_STRING_HASHING
- if (HashHelpers.s_UseRandomizedStringHashing)
- {
- return InternalMarvin32HashString(this, this.Length, 0);
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
-
- return GetLegacyNonRandomizedHashCode();
+ return InternalMarvin32HashString(this);
}
// Gets a hash code for this string and this comparison. If strings A and B and comparition C are such
diff --git a/src/pal/prebuilt/inc/mscoree.h b/src/pal/prebuilt/inc/mscoree.h
index 29f7b261d3..45b8864d69 100644
--- a/src/pal/prebuilt/inc/mscoree.h
+++ b/src/pal/prebuilt/inc/mscoree.h
@@ -317,7 +317,7 @@ enum __MIDL___MIDL_itf_mscoree_0000_0000_0002
STARTUP_ARM = 0x400000,
STARTUP_SINGLE_APPDOMAIN = 0x800000,
STARTUP_APPX_APP_MODEL = 0x1000000,
- STARTUP_DISABLE_RANDOMIZED_STRING_HASHING = 0x2000000
+ STARTUP_DISABLE_RANDOMIZED_STRING_HASHING = 0x2000000 // not supported
} STARTUP_FLAGS;
typedef /* [public] */
diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp
index a569b90052..7b0da7f5a2 100644
--- a/src/vm/appdomain.cpp
+++ b/src/vm/appdomain.cpp
@@ -78,12 +78,10 @@
#include "clrprivtypecachewinrt.h"
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
#pragma warning(push)
#pragma warning(disable:4324)
#include "marvin32.h"
#pragma warning(pop)
-#endif
// this file handles string conversion errors for itself
#undef MAKE_TRANSLATIONFAILED
@@ -709,10 +707,6 @@ OBJECTHANDLE ThreadStaticHandleTable::AllocateHandles(DWORD nRequested)
//*****************************************************************************
void BaseDomain::Attach()
{
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- // Randomized string hashing is on by default for String.GetHashCode in coreclr.
- COMNlsHashProvider::s_NlsHashProvider.SetUseRandomHashing((CorHost2::GetStartupFlags() & STARTUP_DISABLE_RANDOMIZED_STRING_HASHING) == 0);
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
m_SpecialStaticsCrst.Init(CrstSpecialStatics);
}
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp
index 94e3831502..766336ee7f 100644
--- a/src/vm/comutilnative.cpp
+++ b/src/vm/comutilnative.cpp
@@ -2997,14 +2997,11 @@ COMNlsHashProvider::COMNlsHashProvider()
{
LIMITED_METHOD_CONTRACT;
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- bUseRandomHashing = FALSE;
pEntropy = NULL;
pDefaultSeed = NULL;
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
}
-INT32 COMNlsHashProvider::HashString(LPCWSTR szStr, SIZE_T strLen, BOOL forceRandomHashing, INT64 additionalEntropy)
+INT32 COMNlsHashProvider::HashString(LPCWSTR szStr, SIZE_T strLen)
{
CONTRACTL {
THROWS;
@@ -3013,108 +3010,15 @@ INT32 COMNlsHashProvider::HashString(LPCWSTR szStr, SIZE_T strLen, BOOL forceRan
}
CONTRACTL_END;
-#ifndef FEATURE_RANDOMIZED_STRING_HASHING
- _ASSERTE(forceRandomHashing == false);
- _ASSERTE(additionalEntropy == 0);
-#endif
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- if(bUseRandomHashing || forceRandomHashing)
- {
- int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
-
- if(additionalEntropy == 0)
- {
- SymCryptMarvin32(GetDefaultSeed(), (PCBYTE) szStr, strLen * sizeof(WCHAR), (PBYTE) &marvinResult);
- }
- else
- {
- SYMCRYPT_MARVIN32_EXPANDED_SEED seed;
- CreateMarvin32Seed(additionalEntropy, &seed);
- SymCryptMarvin32(&seed, (PCBYTE) szStr, strLen * sizeof(WCHAR), (PBYTE) &marvinResult);
- }
+ int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
+
+ SymCryptMarvin32(GetDefaultSeed(), (PCBYTE) szStr, strLen * sizeof(WCHAR), (PBYTE) &marvinResult);
- return marvinResult[0] ^ marvinResult[1];
- }
- else
- {
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
- return ::HashString(szStr);
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
+ return marvinResult[0] ^ marvinResult[1];
}
-INT32 COMNlsHashProvider::HashSortKey(PCBYTE pSrc, SIZE_T cbSrc, BOOL forceRandomHashing, INT64 additionalEntropy)
-{
- CONTRACTL {
- THROWS;
- GC_NOTRIGGER;
- MODE_ANY;
- }
- CONTRACTL_END;
-
-#ifndef FEATURE_RANDOMIZED_STRING_HASHING
- _ASSERTE(forceRandomHashing == false);
- _ASSERTE(additionalEntropy == 0);
-#endif
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- if(bUseRandomHashing || forceRandomHashing)
- {
- int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
-
- // Sort Keys are terminated with a null byte which we didn't hash using the old algorithm,
- // so we don't have it with Marvin32 either.
- if(additionalEntropy == 0)
- {
- SymCryptMarvin32(GetDefaultSeed(), pSrc, cbSrc - 1, (PBYTE) &marvinResult);
- }
- else
- {
- SYMCRYPT_MARVIN32_EXPANDED_SEED seed;
- CreateMarvin32Seed(additionalEntropy, &seed);
- SymCryptMarvin32(&seed, pSrc, cbSrc - 1, (PBYTE) &marvinResult);
- }
-
- return marvinResult[0] ^ marvinResult[1];
- }
- else
- {
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
- // Ok, lets build the hashcode -- mostly lifted from GetHashCode() in String.cs, for strings.
- int hash1 = 5381;
- int hash2 = hash1;
- const BYTE *pB = pSrc;
- BYTE c;
-
- while (pB != 0 && *pB != 0) {
- hash1 = ((hash1 << 5) + hash1) ^ *pB;
- c = pB[1];
-
- //
- // FUTURE: Update NewAPis::LCMapStringEx to perhaps use a different, bug free, Win32 API on Win2k3 to workaround the issue discussed below.
- //
- // On Win2k3 Server, LCMapStringEx(LCMAP_SORTKEY) output does not correspond to CompareString in all cases, breaking the .NET GetHashCode<->Equality Contract
- // Due to a fluke in our GetHashCode method, we avoided this issue due to the break out of the loop on the binary-zero byte.
- //
- if (c == 0)
- break;
-
- hash2 = ((hash2 << 5) + hash2) ^ c;
- pB += 2;
- }
-
- return hash1 + (hash2 * 1566083941);
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
-
-}
-
-INT32 COMNlsHashProvider::HashiStringKnownLower80(LPCWSTR szStr, INT32 strLen, BOOL forceRandomHashing, INT64 additionalEntropy)
+INT32 COMNlsHashProvider::HashSortKey(PCBYTE pSrc, SIZE_T cbSrc)
{
CONTRACTL {
THROWS;
@@ -3123,73 +3027,15 @@ INT32 COMNlsHashProvider::HashiStringKnownLower80(LPCWSTR szStr, INT32 strLen, B
}
CONTRACTL_END;
-#ifndef FEATURE_RANDOMIZED_STRING_HASHING
- _ASSERTE(forceRandomHashing == false);
- _ASSERTE(additionalEntropy == 0);
-#endif
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- if(bUseRandomHashing || forceRandomHashing)
- {
- WCHAR buf[SYMCRYPT_MARVIN32_INPUT_BLOCK_SIZE * 8];
- SYMCRYPT_MARVIN32_STATE marvinState;
- SYMCRYPT_MARVIN32_EXPANDED_SEED seed;
-
- if(additionalEntropy == 0)
- {
- SymCryptMarvin32Init(&marvinState, GetDefaultSeed());
- }
- else
- {
- CreateMarvin32Seed(additionalEntropy, &seed);
- SymCryptMarvin32Init(&marvinState, &seed);
- }
-
- LPCWSTR szEnd = szStr + strLen;
-
- const UINT A_TO_Z_RANGE = (UINT)('z' - 'a');
-
- while (szStr != szEnd)
- {
- size_t count = (sizeof(buf) / sizeof(buf[0]));
-
- if ((size_t)(szEnd - szStr) < count)
- count = (size_t)(szEnd - szStr);
-
- for (size_t i = 0; i<count; i++)
- {
- WCHAR c = szStr[i];
-
- if ((UINT)(c - 'a') <= A_TO_Z_RANGE) // if (c >='a' && c <= 'z')
- {
- //If we have a lowercase character, ANDing off 0x20
- // will make it an uppercase character.
- c &= ~0x20;
- }
-
- buf[i] = c;
- }
-
- szStr += count;
-
- SymCryptMarvin32Append(&marvinState, (PCBYTE) &buf, sizeof(WCHAR) * count);
- }
+ int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
+
+ // Sort Keys are terminated with a null byte which we didn't hash using the old algorithm,
+ // so we don't have it with Marvin32 either.
+ SymCryptMarvin32(GetDefaultSeed(), pSrc, cbSrc - 1, (PBYTE) &marvinResult);
- int marvinResult[SYMCRYPT_MARVIN32_RESULT_SIZE / sizeof(int)];
- SymCryptMarvin32Result(&marvinState, (PBYTE) &marvinResult);
- return marvinResult[0] ^ marvinResult[1];
- }
- else
- {
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
- return ::HashiStringKnownLower80(szStr);
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- }
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
+ return marvinResult[0] ^ marvinResult[1];
}
-
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
void COMNlsHashProvider::InitializeDefaultSeed()
{
CONTRACTL {
@@ -3257,27 +3103,8 @@ PCBYTE COMNlsHashProvider::GetEntropy()
return (PCBYTE) pEntropy;
}
-
-void COMNlsHashProvider::CreateMarvin32Seed(INT64 additionalEntropy, PSYMCRYPT_MARVIN32_EXPANDED_SEED pExpandedMarvinSeed)
-{
- CONTRACTL {
- THROWS;
- GC_NOTRIGGER;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- INT64 *pEntropy = (INT64*) GetEntropy();
- INT64 entropy;
-
- entropy = *pEntropy ^ additionalEntropy;
-
- SymCryptMarvin32ExpandSeed(pExpandedMarvinSeed, (PCBYTE) &entropy, SYMCRYPT_MARVIN32_SEED_SIZE);
-}
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
-
#ifdef FEATURE_COREFX_GLOBALIZATION
-INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKey, BOOL forceRandomizedHashing, INT64 additionalEntropy)
+INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKey)
{
QCALL_CONTRACT;
@@ -3285,7 +3112,7 @@ INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKe
BEGIN_QCALL;
- retVal = COMNlsHashProvider::s_NlsHashProvider.HashSortKey(pSortKey, cbSortKey, forceRandomizedHashing, additionalEntropy);
+ retVal = COMNlsHashProvider::s_NlsHashProvider.HashSortKey(pSortKey, cbSortKey);
END_QCALL;
diff --git a/src/vm/comutilnative.h b/src/vm/comutilnative.h
index 41df265e91..831e1c071e 100644
--- a/src/vm/comutilnative.h
+++ b/src/vm/comutilnative.h
@@ -27,7 +27,6 @@
#undef GetCurrentTime
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
#pragma warning(push)
#pragma warning(disable:4324)
#if !defined(CROSS_COMPILE) && defined(_TARGET_ARM_) && !defined(PLATFORM_UNIX)
@@ -35,7 +34,6 @@
#endif
#include "marvin32.h"
#pragma warning(pop)
-#endif
//
//
@@ -260,33 +258,24 @@ class COMNlsHashProvider {
public:
COMNlsHashProvider();
- INT32 HashString(LPCWSTR szStr, SIZE_T strLen, BOOL forceRandomHashing, INT64 additionalEntropy);
- INT32 HashSortKey(PCBYTE pSrc, SIZE_T cbSrc, BOOL forceRandomHashing, INT64 additionalEntropy);
- INT32 HashiStringKnownLower80(LPCWSTR lpszStr, INT32 strLen, BOOL forceRandomHashing, INT64 additionalEntropy);
+ INT32 HashString(LPCWSTR szStr, SIZE_T strLen);
+ INT32 HashSortKey(PCBYTE pSrc, SIZE_T cbSrc);
static COMNlsHashProvider s_NlsHashProvider;
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- void SetUseRandomHashing(BOOL useRandomHashing) { LIMITED_METHOD_CONTRACT; bUseRandomHashing = useRandomHashing; }
- BOOL GetUseRandomHashing() { LIMITED_METHOD_CONTRACT; return bUseRandomHashing; }
-
-
private:
- BOOL bUseRandomHashing;
PBYTE pEntropy;
PCSYMCRYPT_MARVIN32_EXPANDED_SEED pDefaultSeed;
PCBYTE GetEntropy();
PCSYMCRYPT_MARVIN32_EXPANDED_SEED GetDefaultSeed();
void InitializeDefaultSeed();
- void CreateMarvin32Seed(INT64 additionalEntropy, PSYMCRYPT_MARVIN32_EXPANDED_SEED pExpandedMarvinSeed);
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
};
#ifdef FEATURE_COREFX_GLOBALIZATION
class CoreFxGlobalization {
public:
- static INT32 QCALLTYPE HashSortKey(PCBYTE pSortKey, INT32 cbSortKey, BOOL forceRandomizedHashing, INT64 additionalEntropy);
+ static INT32 QCALLTYPE HashSortKey(PCBYTE pSortKey, INT32 cbSortKey);
};
#endif // FEATURE_COREFX_GLOBALIZATION
diff --git a/src/vm/crossgen_mscorlib/CMakeLists.txt b/src/vm/crossgen_mscorlib/CMakeLists.txt
index 598ee9952c..12fdf9064f 100644
--- a/src/vm/crossgen_mscorlib/CMakeLists.txt
+++ b/src/vm/crossgen_mscorlib/CMakeLists.txt
@@ -6,7 +6,6 @@ add_definitions(
-DFEATURE_EVENT_TRACE=1
-DFEATURE_LOADER_OPTIMIZATION
-DFEATURE_MULTICOREJIT
- -DFEATURE_RANDOMIZED_STRING_HASHING
-DFEATURE_VERSIONING_LOG
)
diff --git a/src/vm/ecalllist.h b/src/vm/ecalllist.h
index b76b81cb05..876bafc47b 100644
--- a/src/vm/ecalllist.h
+++ b/src/vm/ecalllist.h
@@ -126,10 +126,7 @@ FCFuncStart(gStringFuncs)
FCFuncElement("SetTrailByte", COMString::FCSetTrailByte)
FCFuncElement("TryGetTrailByte", COMString::FCTryGetTrailByte)
#endif // FEATURE_COMINTEROP
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
FCFuncElement("InternalMarvin32HashString", COMString::Marvin32HashString)
- QCFuncElement("InternalUseRandomizedHashing", COMString::UseRandomizedHashing)
-#endif // FEATURE_RANDOMIZED_STRING_HASHING
FCFuncEnd()
FCFuncStart(gStringBufferFuncs)
diff --git a/src/vm/mscorlib.h b/src/vm/mscorlib.h
index b8c181af1d..463a97b3bd 100644
--- a/src/vm/mscorlib.h
+++ b/src/vm/mscorlib.h
@@ -113,9 +113,6 @@ DEFINE_CLASS_U(System, AppDomainSetup, AppDomainSetupObjec
DEFINE_FIELD_U(_Entries, AppDomainSetupObject, m_Entries)
DEFINE_FIELD_U(_AppBase, AppDomainSetupObject, m_AppBase)
DEFINE_FIELD_U(_CompatFlags, AppDomainSetupObject, m_CompatFlags)
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
-DEFINE_FIELD_U(_UseRandomizedStringHashing, AppDomainSetupObject, m_UseRandomizedStringHashing)
-#endif
DEFINE_CLASS(ARG_ITERATOR, System, ArgIterator)
DEFINE_CLASS_U(System, ArgIterator, VARARGS) // Includes a SigPointer.
diff --git a/src/vm/object.h b/src/vm/object.h
index 8febf02a3a..20d7d50961 100644
--- a/src/vm/object.h
+++ b/src/vm/object.h
@@ -1898,10 +1898,6 @@ class AppDomainSetupObject : public Object
PTRARRAYREF m_Entries;
STRINGREF m_AppBase;
OBJECTREF m_CompatFlags;
-#ifdef FEATURE_RANDOMIZED_STRING_HASHING
- CLR_BOOL m_UseRandomizedStringHashing;
-#endif
-
protected:
AppDomainSetupObject() { LIMITED_METHOD_CONTRACT; }