0
点赞
收藏
分享

微信扫一扫

BKDRHash算法Mysql实现


最近有个数据补漏的任务,要在db里进行分库的数据库根据VISITORID落入不同数据库

java实现如下:

public static int BKDRHash(char[] str) {
// 31 131 1313 13131 131313 etc..
int seed = 131;
int hash = 0;
for (int i = 0; i < str.length; i++) {
hash = hash * seed + (str[i]);
}
return (hash & 0x7FFFFFFF);
}
}

mysql实现:

函数addOverFlow防止数据溢出

CREATE FUNCTION `addOverFlow`(`sum` int,`num` int) RETURNS int(11)
NO SQL
BEGIN
DECLARE temp INT;
SET temp = 0;
IF num >= 0 THEN
IF sum >= 2147483647 - num THEN
SET temp = sum - (2147483647 - num);
SET sum = -2147483648 + temp - 1;
ELSE
SET sum = sum + num;
END IF;
ELSE
IF sum < -2147483648 - num THEN
SET temp = (-2147483648 - num) - sum;
SET sum = 2147483647 - temp + 1;
ELSE
SET sum = sum + num;
END IF;
END IF;
RETURN sum;
END

BKDRHash函数:

CREATE FUNCTION `BKDRHash`(`IN_VISITORID` VARCHAR(128)) RETURNS int(11)
NO SQL
BEGIN
DECLARE seed INT;
DECLARE iseed INT;
DECLARE hashcode INT;
DECLARE temphashcode INT;
DECLARE temp INT;
DECLARE i INT;
DECLARE strlen INT;
DECLARE result INT;
DECLARE charOrd INT;
SET seed = 131;
SET iseed = 1;
SET hashcode = 0;
SET temphashcode = 0;
SET i = 1;
-- 字符串长度
SET strlen = length(IN_VISITORID);
-- 结果
SET result = 0;
-- 单个字符ascii码
SET charOrd = 0seed;
-- 从1开始截取字符串字符
WHILE i <= strlen DO
-- 获取单个字符ascii码
SET charOrd = ASCII(SUBSTRING(IN_VISITORID, i, 1));
SET temphashcode = hashcode;
SET iseed = 1;
-- 把乘法变成加法运算
WHILE iseed <= seed - 1 DO
SET hashcode = addOverFlow(hashcode, temphashcode);
SET iseed = iseed + 1;
END WHILE;
-- 加上单个字符的ascii码
SET hashcode = addOverFlow(hashcode, charOrd);
SET i = i + 1;

END WHILE;
SET result = hashcode & 0x7FFFFFFF;
RETURN result;
END



举报

相关推荐

0 条评论