time33 java_Time33算法

Time33是字符串哈希函数,现在几乎所有流行的HashMap都采用了DJB Hash Function,俗称“Times33”算法。Times33的算法很简单,就是不断的乘33。

c语言版本

#include "stdio.h"

unsigned int time33(char *);

int main(){

char str[3] = "c语言";

int res;

res = time33(str);

printf("%d", res);

}

/**

* time33算法

*/

unsigned int time33(char *str){

unsigned int hash = 5381;

while(*str){

hash += (hash << 5 ) + (*str++);

}

return (hash & 0x7FFFFFFF);

}

JAVA版本

public String time33(String skey) {

if (skey == null) return null;

int hash = 5381;

for (int i = 0, len = skey.length(); i < len; ++i) {

int cc = skey.charAt(i);

hash += (hash << 5) + cc;

}

hash &= 0x7fffffff;

return String.valueOf(hash);

}

Javascript版本

//哈希time33算法

function time33(str){

for(var i = 0, len = str.length,hash = 5381; i < len; ++i){

hash += (hash << 5) + str.charAt(i).charCodeAt();

};

return hash & 0x7fffffff;

};

PHP版本

function myHash($str) {

// hash(i) = hash(i-1) * 33 + str[i]

$hash = 5381;

$s = md5($str); //相比其它版本,进行了md5加密

$seed = 5;

$len = 32;//加密后长度32

for ($i = 0; $i < $len; $i++) {

// (hash << 5) + hash 相当于 hash * 33

//$hash = sprintf("%u", $hash * 33) + ord($s{$i});

//$hash = ($hash * 33 + ord($s{$i})) & 0x7FFFFFFF;

$hash = ($hash << $seed) + $hash + ord($s{$i});

}

return $hash & 0x7FFFFFFF;

}

为什么初始值是5381?

5381(001 010 100 000 101),据说hash后的分布更好一些。

Magic Constant 5381:

1. odd number

2. prime number

3. deficient number

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值