2016-08-13 2 views
1

MySQL 함수에서 Arma 3 게임에서 사용하는 GUID를 생성하는 함수를 다시 작성하려고합니다. 다양한 언어의 몇 가지 예는 여기에 있습니다 :비트 연산 문제

CREATE DEFINER=`root`@`localhost` FUNCTION `generateGUID`(playerid varchar(17)) RETURNS varchar(32) CHARSET latin1 
BEGIN 
DECLARE temp bigint; 
DECLARE i int; 

SET i = 0; 
SET temp = 0; 

WHILE i < 8 DO 
    SET temp = temp + CHAR(playerid & 0xFF); 
    SET playerid = playerid >> 8; 
    SET i = i + 1; 
END WHILE; 

RETURN MD5("BE" + temp); 
END 

내가 지금까지 PHP 예제를 배향 이해 무엇 : https://gist.github.com/Fank/11127158

Basicially이 내가 지금까지 뭘하려 모든

먼저 우리 그 증기가 varchar로 주어진있다.

나중에 우리는 8 번 반복하고 playerid의 비트 추가 문자와 0xFF 값을 추가합니다. 그런 다음 playerid에서 8 비트 오른쪽 시프트를 수행합니다.

문자열 "BE"가 임시 결과에 추가되고 md5가 생성되어 반환됩니다.

그러나이 함수는 항상 0을 반환한다는 문제에 직면하고 있습니다. temp var에 int 대신 blob을 사용하는 것처럼 지금까지 많은 것을 시도했습니다.

편집 : 힌트 후 대신 결과가 여전히 거기에 GUID 계산기와 일치하지 않는 + 연산자의 CONCAT를 사용합니다.

코드는 다음과 지금 같습니다 그러나

CREATE DEFINER=`root`@`localhost` FUNCTION `generateGUID`(playerid varchar(17)) RETURNS varchar(32) CHARSET latin1 
BEGIN 
DECLARE temp bigint; 
DECLARE i int; 

SET i = 0; 
SET temp = ""; 

WHILE i < 8 DO 
    SET temp = CONCAT(temp, CHAR(playerid & 0xFF)); 
    SET playerid = playerid >> 8; 
    SET i = i + 1; 
END WHILE; 

RETURN MD5(CONCAT("BE", temp)); 
END 

, 함수가 예상 출력해야하는 2a0f7ebed67e04afaf7ea032e1ed22e3 대신 cd97cc68c1038b485b081ba2aa3ea6fa의를 반환 playerid 76561197996545192를 사용하여.

+0

사용 CONCAT() 함수 -하지'+'. –

+0

감사합니다. @PaulSpiegel. 나는 원래의 게시물을 편집했는데, 아직도 직면 한 하나의 문제가있다. – chris579

+0

디버깅을 시도하고 첫 번째 차이점이 PHP 솔루션과 비교되는 부분을 찾아보십시오. –

답변

1

이것은 나를 위해 작동 : 문자열 concatinations에 대한

DROP FUNCTION IF EXISTS `generateGUID`; 
DELIMITER // 
CREATE DEFINER=`root`@`localhost` FUNCTION `generateGUID`(`playerid` BIGINT UNSIGNED) RETURNS varchar(32) CHARSET latin1 
    DETERMINISTIC 
BEGIN 
DECLARE temp text CHARSET ascii; 
DECLARE i int; 

SET i = 0; 
SET temp = ""; 

WHILE i < 8 DO 
    SET temp = CONCAT(temp, CHAR(playerid & 0xFF)); 
    SET playerid = playerid >> 8; 
    SET i = i + 1; 
END WHILE; 

RETURN MD5(CONCAT("BE", temp)); 
END// 
DELIMITER ; 

http://sqlfiddle.com/#!9/6cc709/1

+0

큰 감사드립니다. 완벽하게 작동합니다! – chris579