سؤال
أريد الحصول على MD5 Hash لقيمة سلسلة في SQL Server 2005.أفعل ذلك باستخدام الأمر التالي:
SELECT HashBytes('MD5', 'HelloWorld')
ومع ذلك، يؤدي هذا إلى إرجاع VarBinary بدلاً من قيمة VarChar.إذا حاولت التحويل 0x68E109F0F40CA72A15E05CC22786F8E6
في VarChar أحصل عليه há ðô§*à\Â'†øæ
بدلاً من 68E109F0F40CA72A15E05CC22786F8E6
.
هل هناك أي حل يعتمد على SQL؟
المحلول
لقد وجدت الحل في مكان آخر:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
نصائح أخرى
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
يستخدم master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
بدلاً من master.dbo.fn_varbintohexstr
وثم substringing
النتائج.
في الحقيقة fn_varbintohexstr
المكالمات fn_varbintohexsubstring
داخليا.الحجة الأولى ل fn_varbintohexsubstring
يقول له أن يضيف 0xF
كالبادئة أم لا. fn_varbintohexstr
المكالمات fn_varbintohexsubstring
مع 1
كالحجة الأولى داخليا.
لأنك لا تحتاج 0xF
, ، يتصل fn_varbintohexsubstring
مباشرة.
على عكس ما ديفيد نايت يقول أن هذين البديلين يعرضان نفس الاستجابة في MS SQL 2008:
SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))
لذا يبدو أن الخيار الأول هو الخيار الأفضل، بدءًا من الإصدار 2008.
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1 لتحويل النظام الست عشري إلى سلسلة)
قم بتحويل هذا إلى خفض وإزالة 0x من بداية السلسلة بواسطة سلسلة فرعية:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
تمامًا نفس ما حصلنا عليه في C# بعد تحويل البايتات إلى سلسلة
من خلال تجربتي الشخصية في استخدام الكود التالي ضمن إجراء مخزّن والذي قام بتجزئة متغير SP يمكنني التأكيد، على الرغم من عدم توثيقه، فإن هذه المجموعة تعمل بنسبة 100% وفقًا للمثال الخاص بي:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
يبدو أن تغيير نوع البيانات إلى varbinary هو الأفضل بالنسبة لي.