Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Mapping / metadatamappinghashervisitor.hashsourcebuilder.cs / 2 / metadatamappinghashervisitor.hashsourcebuilder.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Data.Common.Utils;
using System.Security.Cryptography;
using System.Globalization;
using System.IO;
namespace System.Data.Mapping
{
///
/// This class keeps recomputing the hash and adding it to the front of the
/// builder when the length of the string gets too long
///
internal class CompressingHashBuilder : StringHashBuilder
{
// this max comes from the value that Md5Hasher uses for a buffer size when it is reading
// from a stream
private const int HashCharacterCompressionThreshold = 0x1000 / 2; // num bytes / 2 to convert to typical unicode char size
private const int SpacesPerIndent = 4;
private int _indent = 0;
// we are starting the buffer at 1.5 times the number of bytes
// for the threshold
internal CompressingHashBuilder()
: base((HashCharacterCompressionThreshold + (HashCharacterCompressionThreshold / 2)) * 2)
{
}
internal override void Append(string content)
{
base.Append(string.Empty.PadLeft(SpacesPerIndent * _indent, ' '));
base.Append(content);
CompressHash();
}
internal override void AppendLine(string content)
{
base.Append(string.Empty.PadLeft(SpacesPerIndent * _indent, ' '));
base.AppendLine(content);
CompressHash();
}
///
/// add string like "typename Instance#1"
///
///
internal void AppendObjectStartDump(object o, int objectIndex)
{
base.Append(string.Empty.PadLeft(SpacesPerIndent * _indent, ' '));
base.Append(o.GetType().ToString());
base.Append(" Instance#");
base.AppendLine(objectIndex.ToString(CultureInfo.InvariantCulture));
CompressHash();
this._indent++;
}
internal void AppendObjectEndDump()
{
Debug.Assert(this._indent > 0, "Indent and unindent should be paired");
this._indent--;
}
private void CompressHash()
{
if(base.CharCount >= HashCharacterCompressionThreshold)
{
string hash = ComputeHash();
Clear();
base.Append(hash);
}
}
}
///
/// this class collects several strings together, and allows you to (
///
internal class StringHashBuilder
{
private MD5CryptoServiceProvider _md5HashProvider = new MD5CryptoServiceProvider();
private const string NewLine = "\n";
List _strings = new List();
int _totalLength;
byte[] _cachedBuffer;
internal StringHashBuilder()
{
}
internal StringHashBuilder(int startingBufferSize)
{
Debug.Assert(startingBufferSize > 0, "should be a non zero positive integer");
_cachedBuffer = new byte[startingBufferSize];
}
internal int CharCount { get { return _totalLength; } }
internal virtual void Append(string s)
{
InternalAppend(s);
}
internal virtual void AppendLine(string s)
{
InternalAppend(s);
InternalAppend(NewLine);
}
private void InternalAppend(string s)
{
if (s.Length == 0)
return;
_strings.Add(s);
_totalLength += s.Length;
}
internal string ComputeHash()
{
int byteCount = GetByteCount();
if(_cachedBuffer == null)
{
// assume it is a one time use, and
// it will grow later if needed
_cachedBuffer = new byte[byteCount];
}
else if (_cachedBuffer.Length < byteCount)
{
// grow it by what is needed at a minimum, or 1.5 times bigger
// if that is bigger than what is needed this time. We
// make it 1.5 times bigger in hopes to reduce the number of allocations (consider the
// case where the next one it 1 bigger)
int bufferSize = Math.Max(_cachedBuffer.Length + (_cachedBuffer.Length / 2), byteCount);
_cachedBuffer = new byte[bufferSize];
}
int start = 0;
foreach (string s in _strings)
{
start += Encoding.Unicode.GetBytes(s, 0, s.Length, _cachedBuffer, start);
}
Debug.Assert(start == byteCount, "Did we use a different calculation for these?");
byte[] hash = _md5HashProvider.ComputeHash(_cachedBuffer, 0, byteCount);
return ConvertHashToString(hash);
}
internal void Clear()
{
_strings.Clear();
_totalLength = 0;
}
public override string ToString()
{
StringBuilder builder = new StringBuilder();
_strings.ForEach(s => builder.Append(s));
return builder.ToString();
}
private int GetByteCount()
{
int count = 0;
foreach (string s in _strings)
{
count += Encoding.Unicode.GetByteCount(s);
}
return count;
}
private static string ConvertHashToString(byte[] hash)
{
StringBuilder stringData = new StringBuilder(hash.Length * 2);
// Loop through each byte of the data and format each one as a
// hexadecimal string
for (int i = 0; i < hash.Length; i++)
{
stringData.Append(hash[i].ToString("x2", CultureInfo.InvariantCulture));
}
return stringData.ToString();
}
public static string ComputeHash(string source)
{
StringHashBuilder builder = new StringHashBuilder();
builder.Append(source);
return builder.ComputeHash();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Data.Common.Utils;
using System.Security.Cryptography;
using System.Globalization;
using System.IO;
namespace System.Data.Mapping
{
///
/// This class keeps recomputing the hash and adding it to the front of the
/// builder when the length of the string gets too long
///
internal class CompressingHashBuilder : StringHashBuilder
{
// this max comes from the value that Md5Hasher uses for a buffer size when it is reading
// from a stream
private const int HashCharacterCompressionThreshold = 0x1000 / 2; // num bytes / 2 to convert to typical unicode char size
private const int SpacesPerIndent = 4;
private int _indent = 0;
// we are starting the buffer at 1.5 times the number of bytes
// for the threshold
internal CompressingHashBuilder()
: base((HashCharacterCompressionThreshold + (HashCharacterCompressionThreshold / 2)) * 2)
{
}
internal override void Append(string content)
{
base.Append(string.Empty.PadLeft(SpacesPerIndent * _indent, ' '));
base.Append(content);
CompressHash();
}
internal override void AppendLine(string content)
{
base.Append(string.Empty.PadLeft(SpacesPerIndent * _indent, ' '));
base.AppendLine(content);
CompressHash();
}
///
/// add string like "typename Instance#1"
///
///
internal void AppendObjectStartDump(object o, int objectIndex)
{
base.Append(string.Empty.PadLeft(SpacesPerIndent * _indent, ' '));
base.Append(o.GetType().ToString());
base.Append(" Instance#");
base.AppendLine(objectIndex.ToString(CultureInfo.InvariantCulture));
CompressHash();
this._indent++;
}
internal void AppendObjectEndDump()
{
Debug.Assert(this._indent > 0, "Indent and unindent should be paired");
this._indent--;
}
private void CompressHash()
{
if(base.CharCount >= HashCharacterCompressionThreshold)
{
string hash = ComputeHash();
Clear();
base.Append(hash);
}
}
}
///
/// this class collects several strings together, and allows you to (
///
internal class StringHashBuilder
{
private MD5CryptoServiceProvider _md5HashProvider = new MD5CryptoServiceProvider();
private const string NewLine = "\n";
List _strings = new List();
int _totalLength;
byte[] _cachedBuffer;
internal StringHashBuilder()
{
}
internal StringHashBuilder(int startingBufferSize)
{
Debug.Assert(startingBufferSize > 0, "should be a non zero positive integer");
_cachedBuffer = new byte[startingBufferSize];
}
internal int CharCount { get { return _totalLength; } }
internal virtual void Append(string s)
{
InternalAppend(s);
}
internal virtual void AppendLine(string s)
{
InternalAppend(s);
InternalAppend(NewLine);
}
private void InternalAppend(string s)
{
if (s.Length == 0)
return;
_strings.Add(s);
_totalLength += s.Length;
}
internal string ComputeHash()
{
int byteCount = GetByteCount();
if(_cachedBuffer == null)
{
// assume it is a one time use, and
// it will grow later if needed
_cachedBuffer = new byte[byteCount];
}
else if (_cachedBuffer.Length < byteCount)
{
// grow it by what is needed at a minimum, or 1.5 times bigger
// if that is bigger than what is needed this time. We
// make it 1.5 times bigger in hopes to reduce the number of allocations (consider the
// case where the next one it 1 bigger)
int bufferSize = Math.Max(_cachedBuffer.Length + (_cachedBuffer.Length / 2), byteCount);
_cachedBuffer = new byte[bufferSize];
}
int start = 0;
foreach (string s in _strings)
{
start += Encoding.Unicode.GetBytes(s, 0, s.Length, _cachedBuffer, start);
}
Debug.Assert(start == byteCount, "Did we use a different calculation for these?");
byte[] hash = _md5HashProvider.ComputeHash(_cachedBuffer, 0, byteCount);
return ConvertHashToString(hash);
}
internal void Clear()
{
_strings.Clear();
_totalLength = 0;
}
public override string ToString()
{
StringBuilder builder = new StringBuilder();
_strings.ForEach(s => builder.Append(s));
return builder.ToString();
}
private int GetByteCount()
{
int count = 0;
foreach (string s in _strings)
{
count += Encoding.Unicode.GetByteCount(s);
}
return count;
}
private static string ConvertHashToString(byte[] hash)
{
StringBuilder stringData = new StringBuilder(hash.Length * 2);
// Loop through each byte of the data and format each one as a
// hexadecimal string
for (int i = 0; i < hash.Length; i++)
{
stringData.Append(hash[i].ToString("x2", CultureInfo.InvariantCulture));
}
return stringData.ToString();
}
public static string ComputeHash(string source)
{
StringHashBuilder builder = new StringHashBuilder();
builder.Append(source);
return builder.ComputeHash();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ExpressionBuilderCollection.cs
- DynamicControl.cs
- HuffCodec.cs
- CodeDOMUtility.cs
- DbCommandDefinition.cs
- ModuleBuilderData.cs
- DataException.cs
- UpdatePanel.cs
- KeyEvent.cs
- TextFragmentEngine.cs
- TableItemPattern.cs
- XmlSchemaInfo.cs
- WindowsNonControl.cs
- UIElementParaClient.cs
- RequestTimeoutManager.cs
- HitTestResult.cs
- ConcurrencyBehavior.cs
- PtsHelper.cs
- QilParameter.cs
- DateTimeParse.cs
- ViewSimplifier.cs
- URLString.cs
- StylusButton.cs
- WmiPutTraceRecord.cs
- OrderedDictionary.cs
- GifBitmapEncoder.cs
- KnownBoxes.cs
- DataBindingCollection.cs
- LazyTextWriterCreator.cs
- GradientBrush.cs
- TreeView.cs
- FullTextState.cs
- COM2TypeInfoProcessor.cs
- UInt64Storage.cs
- TransactionBehavior.cs
- TimeSpanParse.cs
- UncommonField.cs
- EtwTrace.cs
- CacheModeConverter.cs
- BaseConfigurationRecord.cs
- SelectedDatesCollection.cs
- SubpageParaClient.cs
- ScrollChrome.cs
- PrintPageEvent.cs
- SQLDoubleStorage.cs
- FontStyle.cs
- BitmapEncoder.cs
- ParserHooks.cs
- OutOfMemoryException.cs
- SingleKeyFrameCollection.cs
- ProvidePropertyAttribute.cs
- ColorContextHelper.cs
- InstanceCreationEditor.cs
- UnsafeNativeMethods.cs
- DeploymentExceptionMapper.cs
- SafePointer.cs
- Ray3DHitTestResult.cs
- CapabilitiesPattern.cs
- SelectionHighlightInfo.cs
- ReadOnlyNameValueCollection.cs
- CmsInterop.cs
- CodeMemberProperty.cs
- ChainOfDependencies.cs
- ThreadExceptionEvent.cs
- ArgumentDirectionHelper.cs
- Helper.cs
- RemoteWebConfigurationHostServer.cs
- SemaphoreFullException.cs
- DependencyPropertyKind.cs
- ClientConfigurationHost.cs
- XNodeNavigator.cs
- RIPEMD160.cs
- XmlSchemaInferenceException.cs
- linebase.cs
- wgx_sdk_version.cs
- TabRenderer.cs
- IndicCharClassifier.cs
- WarningException.cs
- MetaData.cs
- TableLayoutPanelCodeDomSerializer.cs
- WebScriptServiceHostFactory.cs
- SettingsPropertyValueCollection.cs
- TransactionFlowElement.cs
- AnimationLayer.cs
- ToolBarTray.cs
- IHttpResponseInternal.cs
- AspCompat.cs
- handlecollector.cs
- GroupLabel.cs
- CngUIPolicy.cs
- PathGradientBrush.cs
- ButtonBaseAdapter.cs
- GreenMethods.cs
- TextDecorationLocationValidation.cs
- DesignerUtility.cs
- TreeViewDesigner.cs
- ReservationCollection.cs
- ThrowHelper.cs
- ComplusTypeValidator.cs
- ConnectionManagementSection.cs