/* Copyright 2010-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Runtime.InteropServices; using System.Security; using System.Security.Cryptography; using System.Text; using MongoDB.Bson; namespace MongoDB.Driver { /// /// Various static utility methods. /// public static class MongoUtils { // public static methods /// /// Gets the MD5 hash of a string. /// /// The string to get the MD5 hash of. /// The MD5 hash. public static string Hash(string text) { using (var md5 = MD5.Create()) { var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); return BsonUtils.ToHexString(hash); } } /// /// Creates a TimeSpan from microseconds. /// /// The microseconds. /// The TimeSpan. public static TimeSpan TimeSpanFromMicroseconds(long microseconds) { return TimeSpan.FromTicks(microseconds * 10); // there are 10 ticks in a microsecond } /// /// Converts a string to camel case by lower casing the first letter (only the first letter is modified). /// /// The string to camel case. /// The camel cased string. public static string ToCamelCase(string value) { return value.Length == 0 ? "" : value.Substring(0, 1).ToLower() + value.Substring(1); } // internal methods /// /// Should only be used when the safety of the data cannot be guaranteed. For instance, /// when the secure string is a password used in a plain text protocol. /// /// The secure string. /// The CLR string. internal static string ToInsecureString(SecureString secureString) { if (secureString == null || secureString.Length == 0) { return ""; } else { #if NET452 var secureStringIntPtr = Marshal.SecureStringToGlobalAllocUnicode(secureString); #else var secureStringIntPtr = SecureStringMarshal.SecureStringToGlobalAllocUnicode(secureString); #endif try { return Marshal.PtrToStringUni(secureStringIntPtr, secureString.Length); } finally { Marshal.ZeroFreeGlobalAllocUnicode(secureStringIntPtr); } } } } }