SQL:比较string是MD5哈希吗?

时间:2012-02-21 15:59:22

标签: sql sql-server sql-server-2005 tsql case-sensitive

问题:

如果字符串是SQL中的MD5哈希,我需要COMPARE。

我找到了这个PHP函数:

function isValidMd5($md5)
{
    return !empty($md5) && preg_match('/^[a-f0-9]{32}$/', $md5);
}

由于SQL缺少{32}语法,我只复制[a-f0-9] 32次:

IF '200ceb26807d6bf99fd6f4f0d1ca54d4' LIKE '[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]' 
BEGIN
    PRINT 'YES'
END
ELSE
BEGIN
    PRINT 'NO'
END 

但是,为了避免与32 [a-f]组成的用户名发生冲突,无论多么不可能,我想做类似的比较大写。

但如果出于测试目的,我会这样做:

IF 'E' COLLATE Latin1_General_CS_AS  LIKE ('[a-f0-9]' COLLATE Latin1_General_CS_AS )
BEGIN
    PRINT 'yes'
END
ELSE
BEGIN
    PRINT 'no'
END 

我得到了,而不是没有。
但是COLLATE Latin1_General_CS_AS应该使它区分大小写......

如何在这个IF中使LIKE区分大小写?

3 个答案:

答案 0 :(得分:2)

这会有用吗?

IF myValue LIKE '[a-f0-9][...]' 
and LOWER(myValue) = myValue

答案 1 :(得分:2)

最好通过检查任何会使其失败的单一事物来反转检查并使其更易于维护。这意味着您不必在代码中重复[0-9a-f]次32次。

IF LEN(@myValue) <> 32 OR LOWER(@myValue) LIKE '%[^0-9a-f]%' 
BEGIN
   -- No it isn't
END ELSE BEGIN
   -- Yes it is
END

,即如果它不是32个字符,或者它包含十六进制集之外的字符,那么它就会失败。

答案 2 :(得分:1)

好的,经过仔细检查后,这是最好的解决方案:

请注意,编写ABCDEF而不是A-F很重要,因为A和F之间的任何字母都不区分大小写。

(至于A-F:请注意,'a'是边界情况,因为它不在此范围内,与'b'不同。)

DECLARE @myValue varchar(100)

--SET @myValue = '66B9E31D4C59D3802279515F9B1A6222'
SET @myValue   = '66B9E31D4C59D3802279515F9B1B6222'


IF LEN(@myValue) <> 32 OR @myValue LIKE '%[^0-9ABCDEF]%' COLLATE Latin1_General_CS_AS   
BEGIN 
   print 'No it isn''t'
END ELSE BEGIN 
   print 'Yes it is '
END 

并且作为MD5-检查功能:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IsMd5Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fn_IsMd5Hash]
GO




-- ========================================================================
-- Author:  
-- Create date:   26.04.2012
-- Last modified: 26.04.2012
-- Description:   Überprüfen ob string ein MD5-Hash ist
-- ========================================================================

-- PRE:  varchar(50) 
-- POST: True/False 
-- PRINT dbo.[fn_IsMd5Hash]('66B9E31D4C59D3802279515F9B1B6222') 
CREATE  FUNCTION [dbo].fn_IsMd5Hash(@strInputAnything varchar(50)) 
    RETURNS bit 
AS
BEGIN 
    DECLARE @bIsMd5Hash AS bit 

    SET @bIsMd5Hash = 'false' 

    IF LEN(@strInputAnything) = 32 AND NOT @strInputAnything LIKE '%[^0-9ABCDEF]%' COLLATE Latin1_General_CS_AS 
        SET @bIsMd5Hash = 'true' 

    RETURN @bIsMd5Hash 
END


GO