سؤال

أريد الحصول على 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 هو الأفضل بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top