diff --git a/clr.coreclr.props b/clr.coreclr.props index 4a71b0a04650..6d3538c341b5 100644 --- a/clr.coreclr.props +++ b/clr.coreclr.props @@ -45,7 +45,6 @@ true true true - true true false diff --git a/clr.defines.targets b/clr.defines.targets index b59dc754596b..64ff2e08705a 100644 --- a/clr.defines.targets +++ b/clr.defines.targets @@ -25,7 +25,6 @@ $(DefineConstants);FEATURE_PATHCOMPAT $(DefineConstants);FEATURE_PERFTRACING $(DefineConstants);FEATURE_EVENTSOURCE_XPLAT - $(DefineConstants);FEATURE_RANDOMIZED_STRING_HASHING $(DefineConstants);FEATURE_SORT_TABLES $(DefineConstants);FEATURE_TYPEEQUIVALENCE $(DefineConstants);FEATURE_USE_LCID diff --git a/clrdefinitions.cmake b/clrdefinitions.cmake index 4f6b0414bb8e..c6f4ad67eb96 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 307f05cdf01f..75739dfc734f 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 1a92e04815eb..34fbf1eb3431 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 a4d962df6dd8..a8409826c6e1 100644 --- a/src/classlibnative/bcltype/stringnative.h +++ b/src/classlibnative/bcltype/stringnative.h @@ -85,10 +85,7 @@ class COMString { 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 505827bc9031..0593a4f0344f 100644 --- a/src/classlibnative/inc/nlsinfo.h +++ b/src/classlibnative/inc/nlsinfo.h @@ -54,7 +54,7 @@ class COMNlsInfo // 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 fa288c0e0ae5..053bb14a65f0 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 53d4ce3bb004..a6b60b92780d 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 f385119c313c..1e27c729f8b8 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 6b1b3291964e..d0fdf4e72512 100644 --- a/src/mscorlib/src/System/AppDomainSetup.cs +++ b/src/mscorlib/src/System/AppDomainSetup.cs @@ -63,10 +63,6 @@ internal enum LoaderInformation // to an AppDomain. We only use the keys, the values are ignored. private Dictionary _CompatFlags; -#if FEATURE_RANDOMIZED_STRING_HASHING - private bool _UseRandomizedStringHashing; -#endif - internal AppDomainSetup(AppDomainSetup copy, bool copyDomainBoundData) { string[] mine = Value; @@ -92,11 +88,6 @@ internal AppDomainSetup(AppDomainSetup copy, bool copyDomainBoundData) { SetCompatibilitySwitches(copy._CompatFlags.Keys); } - -#if FEATURE_RANDOMIZED_STRING_HASHING - _UseRandomizedStringHashing = copy._UseRandomizedStringHashing; -#endif - } } @@ -157,20 +148,11 @@ internal Dictionary GetCompatibilityFlags() public void SetCompatibilitySwitches(IEnumerable switches) { -#if FEATURE_RANDOMIZED_STRING_HASHING - _UseRandomizedStringHashing = false; -#endif if (switches != null) { _CompatFlags = new Dictionary(); 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 436808c4399b..b664520cf117 100644 --- a/src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs +++ b/src/mscorlib/src/System/Collections/Concurrent/ConcurrentDictionary.cs @@ -636,11 +636,7 @@ private bool TryAddInternal(TKey key, TValue value, bool updateIfExists, bool ac // 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 50724017ddf3..0a83734eb0f7 100644 --- a/src/mscorlib/src/System/Collections/Generic/Dictionary.cs +++ b/src/mscorlib/src/System/Collections/Generic/Dictionary.cs @@ -92,12 +92,10 @@ public Dictionary(int capacity, IEqualityComparer comparer) if (capacity > 0) Initialize(capacity); this.comparer = comparer ?? EqualityComparer.Default; -#if FEATURE_RANDOMIZED_STRING_HASHING - if (HashHelpers.s_UseRandomizedStringHashing && this.comparer == EqualityComparer.Default) + if (this.comparer == EqualityComparer.Default) { this.comparer = (IEqualityComparer)NonRandomizedStringEqualityComparer.Default; } -#endif // FEATURE_RANDOMIZED_STRING_HASHING } public Dictionary(IDictionary dictionary) : this(dictionary, null) { } @@ -408,9 +406,7 @@ private bool TryInsert(TKey key, TValue value, InsertionBehavior behavior) 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 @@ private bool TryInsert(TKey key, TValue value, InsertionBehavior behavior) return false; } -#if FEATURE_RANDOMIZED_STRING_HASHING + collisionCount++; -#endif } int index; if (freeCount > 0) @@ -459,18 +454,14 @@ private bool TryInsert(TKey key, TValue value, InsertionBehavior behavior) 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.Default. - // Note, randomized string hashing is turned on by default on coreclr so EqualityComparer.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.Default. if (collisionCount > HashHelpers.HashCollisionThreshold && comparer == NonRandomizedStringEqualityComparer.Default) { comparer = (IEqualityComparer)EqualityComparer.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 760c9d10b28f..4427682d3864 100644 --- a/src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs +++ b/src/mscorlib/src/System/Collections/Generic/EqualityComparer.cs @@ -272,11 +272,8 @@ public override int GetHashCode() => GetType().GetHashCode(); } - // NonRandomizedStringEqualityComparer is the comparer used by default with the Dictionary - // 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 // 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 [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 0c8963282821..fcfcc3bbd6cf 100644 --- a/src/mscorlib/src/System/Collections/Hashtable.cs +++ b/src/mscorlib/src/System/Collections/Hashtable.cs @@ -1392,10 +1392,7 @@ internal class HashtableDebugView [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 e58a78ee6780..92fd691c8b24 100644 --- a/src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs +++ b/src/mscorlib/src/System/Globalization/CompareInfo.Unix.cs @@ -137,14 +137,6 @@ internal static unsafe int LastIndexOfOrdinalCore(string source, string value, i 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 @@ private unsafe static bool IsSortable(char *text, int length) // ---- 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 @@ internal unsafe int GetHashCodeOfStringCore(string source, CompareOptions option { 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 @@ internal unsafe int GetHashCodeOfStringCore(string source, CompareOptions option 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 0df5463a2f60..2bfe15b835ac 100644 --- a/src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs +++ b/src/mscorlib/src/System/Globalization/CompareInfo.Windows.cs @@ -92,7 +92,7 @@ private unsafe int GetHashCodeOfStringCore(string source, CompareOptions options 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 @@ private unsafe SortVersion GetSortVersion() // 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 57b3f53931e2..782ab2775f73 100644 --- a/src/mscorlib/src/System/String.Comparison.cs +++ b/src/mscorlib/src/System/String.Comparison.cs @@ -1002,34 +1002,14 @@ public static bool Equals(String a, String b, StringComparison comparisonType) 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 29f7b261d350..45b8864d6969 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 a569b90052bb..7b0da7f5a221 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 94e38315026b..766336ee7f60 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='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 41df265e9132..831e1c071ed0 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 598ee9952c84..12fdf9064f41 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 b76b81cb056e..876bafc47b3e 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 b8c181af1d93..463a97b3bdc3 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 8febf02a3a28..20d7d5096115 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; }