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版本

<?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

參考
CSRF防御 - 為程序員服務 http://ju.outofmemory.cn/entry/75798
PHP: 深入了解一致性哈希 - 陳一回的個人頁面 - 開源中國社區
http://my.oschina.net/goal/blog/203593?p=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM