سؤال

أحاول تجزئة سلسلة إلى قيمة 64 بت (bigint) في mysql. أنا على علم بوظيفة MD5 ()، والتي ترجع التجزئة 128 بت كسلسلة ثنائية. سأكون سعيدا فقط لأخذ القاع أو أعلى 64 بت من هذه النتيجة. ومع ذلك، لا يمكنني معرفة كيفية الحصول على نوع سلسلة ثنائية إلى نوع رقمي من أي فرز. أي مؤشرات؟

هل كانت مفيدة؟

المحلول

استخدم ال CONV() وظيفة لتحويل MD5 التجزئة من قاعدة 16 إلى قاعدة 10 و CAST لتحويله إلى رقم:

select cast(conv(substring(md5(id), 1, 16), 16, 10) as unsigned integer) from SomeTable;

نصائح أخرى

CREATE FUNCTION dbo.HexStrToVarBinary(@hexstr varchar(8000))
RETURNS varbinary(8000)
AS
BEGIN 
    DECLARE @hex char(1), @i int, @place bigint, @a bigint
    SET @i = LEN(@hexstr) 

    set @place = convert(bigint,1)
    SET @a = convert(bigint, 0)

    WHILE (@i > 0 AND (substring(@hexstr, @i, 1) like '[0-9A-Fa-f]')) 
     BEGIN 
        SET @hex = SUBSTRING(@hexstr, @i, 1) 
        SET @a = @a + 
    convert(bigint, CASE WHEN @hex LIKE '[0-9]' 
         THEN CAST(@hex as int) 
         ELSE CAST(ASCII(UPPER(@hex))-55 as int) end * @place)
    set @place = @place * convert(bigint,16)
        SET @i = @i - 1

     END 

    RETURN convert(varbinary(8000),@a)
END
GO 

مصدر

يمكنك أيضا استخدام CRC32 الوظيفة التي ترجع قيمة غير موقعة 32 بت.

SELECT CRC32(id) from SomeTable;

توثيق

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