请选择 进入手机版 | 继续访问电脑版

 找回密码
 点一下
查看: 3079|回复: 16

简单的hash表算法

[复制链接]
发表于 2009-3-7 16:11:07 | 显示全部楼层 |阅读模式
恩,前些天突然发现需要一个hash的基本系统,但是看到别人写的代码量太大了所以自己写了一个。


//===============================

integer  array              SYS_HashHandle

//===============================
function GetHandleIndexInHashTable takes handle h returns integer
    local integer i = H2I(h)
    local integer tmp = i
    local integer c = 0
    loop
       exitwhen(c>2000)
       set tmp = Mod(tmp*33,8191)//Mod是自己写的,取余数函数
       if(SYS_HashHandle[tmp]==i)then
           return tmp
       endif
       set c = c + 1
    endloop
    return -1
endfunction

function RemoveHandleFromHashTable takes integer i returns nothing
    set SYS_HashHandle = 0
endfunction

function AddHandleToHashTable takes handle h returns integer
    local integer i = H2I(h)
    local integer tmp = i
    local integer c = 0
    loop
       exitwhen(c>2000)
       set tmp = Mod(tmp*33,8191)
       if(SYS_HashHandle[tmp]==0)then
           set SYS_HashHandle[tmp] = i
           return tmp
       endif
       set c = c + 1
    endloop
    return -1
endfunction
//===========================
如上,代码量很少
使用经典的time33算法

评分

参与人数 1威望 +36 收起 理由
kook + 36 33!

查看全部评分

 楼主| 发表于 2009-3-7 16:11:31 | 显示全部楼层
扩展功能自己添加
回复

使用道具 举报

 楼主| 发表于 2009-3-7 16:37:39 | 显示全部楼层
function Mod takes integer m, integer d returns integer
    return m - (m / d) * d
endfunction
回复

使用道具 举报

发表于 2009-3-7 18:13:53 | 显示全部楼层
支持下
回复

使用道具 举报

发表于 2009-3-7 19:12:45 | 显示全部楼层
不懂
回复

使用道具 举报

发表于 2009-3-10 10:29:36 | 显示全部楼层
恕我愚昧了,何为time 33算法?
回复

使用道具 举报

 楼主| 发表于 2009-3-10 10:48:12 | 显示全部楼层
就是用一个数字*33,在模一个质数
如果当前地址有值在*33,直到碰到空值为止。
说8191是质数来的。。blz的设计呀。。
回复

使用道具 举报

 楼主| 发表于 2009-3-10 10:49:48 | 显示全部楼层
据说这个玩意是处理大量数据最简单经典可用的算法(有人比对过time33和blz自己写的hash算法,结论是time33快一点)
回复

使用道具 举报

发表于 2009-3-10 10:52:19 | 显示全部楼层
不过为何是33呢
回复

使用道具 举报

 楼主| 发表于 2009-3-10 10:55:24 | 显示全部楼层
很多老头子算出来的吧。反正据说直接乘这个数字是最快的
回复

使用道具 举报

发表于 2009-3-15 12:10:18 | 显示全部楼层
找到这个了 传说中的TIMER33

支持一下
回复

使用道具 举报

 楼主| 发表于 2009-3-15 12:29:50 | 显示全部楼层
不过这个算法有点问题,要加一个HandleCount,在每次分配handle的时候count+1,否则count-1。
回复

使用道具 举报

发表于 2009-3-15 14:15:00 | 显示全部楼层
set tmp = Mod(tmp*33,8191)

这里有点问题的吧。若第一次运算得tmp=0而且地址被占用的话,以后是不会找到新的地址的。
回复

使用道具 举报

发表于 2009-3-16 00:33:09 | 显示全部楼层
ls复活了?
回复

使用道具 举报

 楼主| 发表于 2009-3-16 03:57:27 | 显示全部楼层
o对,回去改改
回复

使用道具 举报

发表于 2009-3-16 22:35:26 | 显示全部楼层
收藏了,很有用的东西。。。。
回复

使用道具 举报

发表于 2009-3-17 12:28:21 | 显示全部楼层
实际上 貌似 是 8191+1 = 8192 也就是2的13次方 忽略0了。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-19 02:55 , Processed in 0.474178 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表