از اس كيوال سرور 2005 به بعد تابع HashBytes نيز به مجموعه توابع قابل استفاده در دستورات T-SQL اس كيوال سرور اضافه شده است كه الگوريتمهاي MD2 | MD4 | MD5 | SHA | SHA1 را پشتيباني ميكند. براي مثال:
DECLARE @str1 VARCHAR(4),
@str2 NVARCHAR(4)
--متن يونيكد اينجا ناقص ذخيره ميشود
SET @str1 = 'وحيد'
SET @str2 = N'وحيد'
SELECT hashbytes('md5', @str1) --C82A7D721AAE517AD76EF1B871BC33CE
SELECT hashbytes('md5', @str2) --7D883091B80F3CD20B872CADBFDDACDF
اگر اين نتايج را بخواهيم با استفاده از فضاي نام استاندارد System.Security.Cryptography توليد كنيم، بايد به encoding رشته دريافتي حتما دقت داشت؛ در غير اينصورت نتايج يكسان نخواهند بود.
مهمترين encoding هاي پشتيباني شده در دات نت در جدول زير برشمرده شدهاند:
Encoding | تعداد بيت هر كاراكتر |
ASCII | هر كاراكتر آن 7 بيت است |
UTF7 | هر كاراكتر آن 7 بيت است |
UTF8 | هر كاراكتر آن 8 بيت و يا يك بايت است |
Unicode (UTF-16) | هر كاراكتر آن 16 بيت و يا دو بايت است |
UTF32 | هر كاراكتر آن 32 بيت و يا 4 بايت است |
نوع nvarchar در اس كيوال سرور همانند حالت Encoding.Unicode دات نت است و هر كاراكتر آن 2 بايت ميباشد.
اين نكته هنگام استفاده از اين توابع بسيار حائز اهميت است. براي مثال اگر تابع HashBytes اس كيوال سرور را بخواهيم در دات نت پياده سازي كنيم، به كلاس زير خواهيم رسيد:
using System.Text;
using System.Security.Cryptography;
class CHash
{
public static string GetMD5Hash(string input, Encoding encoding)
{
byte[] bytes = new MD5CryptoServiceProvider().ComputeHash(encoding.GetBytes(input));
StringBuilder chars = new StringBuilder();
foreach (byte chr in bytes)
{
chars.Append(chr.ToString("x2"));
}
return chars.ToString();
}
}
string result = CHash.GetMD5Hash("وحيد", Encoding.Unicode);
پ.ن.
احتمالا عدهاي را ديدهايد كه هر چقدر تلاش ميكنند با سي شارپ متون ايران سيستم تحت داس را به نمونههاي ويندوزي تبديل كنند، كمتر موفق ميشوند؛ علت را با توجه به جدول encoding فوق و عدم اطلاع از آن بهتر ميتوان بررسي كرد.