اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
از اس کیوال سرور 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 فوق و عدم اطلاع از آن بهتر میتوان بررسی کرد.