@52fhy
        
        2015-08-23T03:49:24.000000Z
        字数 1166
        阅读 795
    算法
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版本
<?phpfunction myHash($str) {// hash(i) = hash(i-1) * 33 + str[i]$hash = 5381;$s = md5($str); //相比其它版本,进行了md5加密$seed = 5;$len = 32;//加密后长度32for ($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 number2. prime number3. deficient number
参考
CSRF防御 - 为程序员服务 http://ju.outofmemory.cn/entry/75798
PHP: 深入了解一致性哈希 - 陈一回的个人页面 - 开源中国社区
http://my.oschina.net/goal/blog/203593?p=1
