2009-08-11 52 views
8

Tôi đang cố gắng băm chuỗi thành giá trị 64 bit (bigint) trong MySQL. Tôi biết về hàm MD5(), hàm này trả về băm 128 bit dưới dạng chuỗi nhị phân. Tôi muốn được hạnh phúc để chỉ mất 64 bit phía trên hoặc trên cùng của kết quả này. Tuy nhiên, tôi không thể tìm ra cách để có được từ một loại chuỗi nhị phân đến một kiểu số của bất kỳ loại nào. Bất kỳ con trỏ?Chuyển đổi chuỗi nhị phân thành bigint trong MySQL?

Trả lời

14

Sử dụng CONV() chức năng để chuyển đổi các hash MD5 từ cơ sở 16 căn 10 và CAST để chuyển đổi nó vào một số:

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

Tốt, đó là những gì tôi đang tìm kiếm. Tôi nghĩ rằng tôi không cần dàn diễn viên, hoặc muốn chuyển sang bigint, nhưng hàm conv() thực sự là những gì tôi đã bỏ lỡ. –

+2

Một lưu ý cuối cùng. Sau đó tôi đã truy cập vào giá trị số này như là một Java dài. Các kiểu số nguyên Java được ký, và kết quả của conv() luôn luôn là dương, có nghĩa là nó tràn trong một số trường hợp. Đối với những người sử dụng này như là một ký dài, bạn cần các diễn viên, và đúc để 'ký' làm các trick. –

2
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 

Source

+0

Nice! hy vọng có một cái gì đó được xây dựng trong. –

+0

Bây giờ cách khác xung quanh xin vui lòng: D: @ :) –

Các vấn đề liên quan