2016-08-13 16 views
1

私は、ゲームのArma 3で使用されるGUIDを生成する関数をMySQL関数で再構築しようとしています。様々な言語のいくつかの例がここの上にあります。https://gist.github.com/Fank/11127158ビット操作の問題

Basiciallyこれは私がこれまで試したものです:

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の例で配向に理解何を:すべての私たちの

ファースト水蒸気をvarcharとして与える。

その後、私たちは8回反復し、playeridのビット単位の加算の文字と0xFFの値を加えます。次に、playeridに8ビット右シフトを実行します。

その後、文字列 "BE"がtemp結果に追加され、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 

しかし、playerid 76561197996545192に機能を使用すると予想される出力すべき2a0f7ebed67e04afaf7ea032e1ed22e3の代わりcd97cc68c1038b485b081ba2aa3ea6faを返します。

+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