mysql取字符串hash值的问题

qqwx_1986 2011-06-07 02:02:42


DELIMITER $$

CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `test`.`HashValue`(IN accountName CHAR(32))
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
SET @size = LENGTH(accountName);
SET @pos = 1;
SET @hashValue = 0;
WHILE @pos<@size+1 DO
SET @nCh = SUBSTRING(accountName,@pos,1);
SET @hashValue = @hashValue + ASCII(@nCh);
SET @pos = @pos + 1;
END WHILE;

SELECT @size,@hashValue;

END$$

DELIMITER ;

我想计算一个字符串的hash值,算法如上,以上如果是纯英文的是没有问题的,比如 select call("abc");
但是如果是中文的话就有问题了,比如select call("我");,由于是UTF8的编码,所以select length("我");是三个字节,但是substring();这个函数的第二个参数pos的含义不是按照字节数来递增的,也就是说,asscii(substring("我",1,1))是230,而asscii(substring("我",2,1))就是0了。
所以select call("我")的结果就是3,230,其实就是取了“我”的一个字节的ascii值

求解了,有么有替代substring()的函数之类或者其他的办法
...全文
4152 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqwx_1986 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]

没有取字节的函数,如果需要则建议先转成HEX,然后再取其中的数字。
[/Quote]
这方法不错,3Q

附上成功代码:


DELIMITER $$

CREATE
PROCEDURE `test`.`HashValue`(IN str CHAR(32))
BEGIN

SET @pos = 1;
SET @hashValue = 0;
SET @szHex = HEX(str);
SET @size = LENGTH(@szHex);
WHILE @pos<@size+1 DO
SET @cCh = SUBSTRING(@szHex,@pos,2);
SET @nCh =CAST(ASCII(UNHEX(@cCh)) AS UNSIGNED);
SET @hashValue = @hashValue + @nCh;
SET @pos = @pos + 2;
END WHILE;

SELECT @hashValue;
END$$

DELIMITER ;
ACMAIN_CHM 2011-06-07
  • 打赏
  • 举报
回复
没有取字节的函数,如果需要则建议先转成HEX,然后再取其中的数字。
qqwx_1986 2011-06-07
  • 打赏
  • 举报
回复
调用应该是 CALL HashValue("我");
上面写错了,不好意思

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧