private static string GetClassThumbprint(XmlAttributeOverrides overrides)
		{
			Hashtable types = GetTypesHashtable(overrides);
			// Types are the most significant information
			// in the key ... that why the type info comes first

			// what does the thumbprint of an XmlAttributeOverrides need to
			// consist of?
			// Type names are the key of the outer hashtable
			// The values of the outer hashtable are more hashtables
			// The keys of the inner hashtables are member names. The
			// values of the inner hashtable are XmlAttributes objects.
			// I.e. to create a content-based thumbprint of an 
			// XmlAttributeOverrides we need to normalize first the
			// type names, then the member names and finally include the
			// values of each XmlAttributes object in the thumbprint.

			// so my first attempt at a thumbprint looks like this:
			// typeName:memberName:attributes:memberName:attributes:...
			// memberNames are orders alphabetically

			// the complete thumbprint for the XmlAttributeOverrides
			// concatenates the individual thumbrprints for a type in
			// the alphabetical order of the type names.

			StringSorter sorter = new StringSorter();
			foreach (Type t in types.Keys)
			{
				sorter.AddString(t.AssemblyQualifiedName);
			}
			string[] sortedTypeNames = sorter.GetOrderedArray();

			// now we have the types for which we have overriding attributes 
			// in alphabetical order

			// TODO
			// Now generate thumbprint for each member of
			// each type
			StringBuilder printBuilder = new StringBuilder();

			foreach (string typeName in sortedTypeNames)
			{
				System.Diagnostics.Debug.WriteLine(string.Format("+++ Starting thumbprint for type {0}", typeName));
				printBuilder.AppendFormat(">>{0}>>", typeName);
				GetTypePrint(typeName, types, printBuilder);
				printBuilder.Append("<<");
				System.Diagnostics.Debug.WriteLine(string.Format("--- Finished thumbprint for type {0}", typeName));
			}
			return printBuilder.ToString();

		}
		private static void GetTypePrint(string typeName, Hashtable attributes, StringBuilder printBuilder)
		{
			Type t = Type.GetType(typeName);
			Hashtable memberAttributes = attributes[t] as Hashtable;
			System.Diagnostics.Debug.Assert(null != memberAttributes);
			StringSorter sorter = new StringSorter();
			foreach (string memberName in memberAttributes.Keys)
			{
				sorter.AddString(memberName);
			}
			string[] sortedMemberNames = sorter.GetOrderedArray();

			foreach (string memberName in sortedMemberNames)
			{
				printBuilder.AppendFormat("**{0}**", memberName);
				System.Diagnostics.Debug.WriteLine(string.Format("++ Started member thumbprint for type {0}, member:{1}.", typeName, memberName));
				GetXmlAttributesThumbprint(memberAttributes[memberName] as XmlAttributes, printBuilder);
				printBuilder.Append("***");
				System.Diagnostics.Debug.WriteLine(string.Format("-- Finished member thumbprint for type {0}, member:{1}.", typeName, memberName));
			}
		}