gpt4 book ai didi

mysql - 按位运算问题

转载 作者:行者123 更新时间:2023-11-28 23:26:58 24 4
gpt4 key购买 nike

我正在尝试在 MySQL 函数中重建一个用于生成游戏 Arma 3 使用的 GUID 的函数。这里有一些各种语言的例子:https://gist.github.com/Fank/11127158

基本上这是我到目前为止尝试过的:

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 示例的理解:

首先,我们将 steamid 作为 varchar 给出。

然后我们迭代 8 次并添加 playerid 和 0xFF 的值的按位加法的字符。然后我们对 playerid 执行 8 位右移。

然后将字符串“BE”添加到临时结果中,并生成 md5 并返回。

但是我遇到了这个函数总是返回 0 的问题。到目前为止我尝试了很多东西,比如使用 blob 而不是 int 作为临时变量。

编辑:在提示使用 CONCAT 而不是 + 运算符后,结果仍然与那里的 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 = "";

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 这应该是预期的输出。

最佳答案

这对我有用:

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

关于mysql - 按位运算问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com