聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

ELFHash SQL实现

2014-08-21 14:38 浏览: 8171 次 我要评论(0 条) 字号:

当前项目中用到了elfhash函数算出HASH值后再进行分表,
当需要在MYSQL里进行查询时比较麻烦,需要先算出HASH值才能确定用户数据被分到哪个表里,
于是把这个函数用SQL写成函数,方便使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
CREATE DEFINER=`test`@`127.0.0.1` FUNCTION `elfhash`(strkey varchar(256)) RETURNS int(11)
NO SQL
BEGIN
#Routine body goes here...
 
/*
unsigned long ELFHash(const char *key)
{
unsigned long h = 0;
unsigned long x = 0;
 
while (*key)
{
h = (h << 4) + (*key++);
if ((x = h & 0xF0000000L) != 0)
{
h ^= (x >> 24);
h &= ~x;
}
}
return (h & 0x7FFFFFFF);
}
*/

 
DECLARE h INT UNSIGNED DEFAULT 0;
DECLARE x INT UNSIGNED DEFAULT 0;
DECLARE k INT UNSIGNED DEFAULT 0;
DECLARE strLen INT UNSIGNED DEFAULT 0;
DECLARE pos INT UNSIGNED DEFAULT 0;
 
SET strLen = LENGTH(strkey)+1;
WHILE (pos<strLen) DO
set k = ASCII(MID(strkey,pos,1));
set h = (h << 4) + k;
SET x = h & 0xF0000000;
IF (x!= 0) THEN
set h = h^(x >> 24);
set h = h&(~x);
END IF;
 
SET pos = pos +1;
END WHILE;
 
SET h = h & 0x7FFFFFFF;
RETURN h;
 
END


网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复