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
时间: 2024-11-02 17:29:40

Time33算法的相关文章

js+jquery常用知识点汇总

 本文主要介绍了jquery源码中常见的知识点以及javascript中原型链常见的知识点,非常的全面,这里推荐给小伙伴们.     一.jquery源码中常见的知识点 1.string,number类型转换的快捷方法   复制代码 代码如下: // @param s为字符串,n为数字 function fn(obj){ //转换为String类型 var s = obj +""; //转换为number类型 var n = +obj; }   分享一个面试例子: //加会将其后面自动

常用的JavaScript WEB操作方法分享

 这篇文章主要介绍了常用的JavaScript WEB操作方法分享,包含数组方法集.cookie方法集.url方法集.正则表达式方法集.字符串方法集.加密方法集.日期方法集等常用操作方法,需要的朋友可以参考下     数组方法集 ? 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 4

js+jquery常用知识点汇总_javascript技巧

一.jquery源码中常见的知识点 1.string,number类型转换的快捷方法 复制代码 代码如下: // @param s为字符串,n为数字 function fn(obj){     //转换为String类型     var s = obj +"";     //转换为number类型     var n = +obj; } 分享一个面试例子: //加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 &

VB.NET字符串哈希算法

Time33在效率和随机性两方面上俱佳.对于一个Hash函数,评价其优劣的标准应为随机性,即对任意一组标本,进入Hash表每一个单元(cell)之概率的平均程度,因为这个概率越平均,数据在表中的分布就越平均,表的空间利用率就越高. Times33的算法很简单,就是不断的乘33,见下面算法原型. hash(i) = hash(i-1) * 33 + str[i] 代码如下:     Public Class Form1          Private Sub Button1_Click(send

time33 哈希函数,又叫 DJBX33A,Bernstein&#039;s hash

php, apache, perl, bsddb都使用time33哈希. 最简单的版本   uint32_t time33(char const *str, int len)     {         unsigned long  hash = 0;         for (int i = 0; i < len; i++) {             hash = hash *33 + (unsigned long) str[i];         }         return hash

[原]VB.NET常用的哈希算法集 差不多30种.

问题描述 VB.NET常用的哈希算法集.其中包括了著名的暴雪的哈希,T33哈希.......全部是网上的C/C++代码改的(VB.NET的资源真的很少).不同的哈希算法在分布式,布降过滤器,位图MAP等等应用得比较多...''</summary>PublicClassMyUnchecked#Region"UInt64"<StructLayout(LayoutKind.Explicit)>PublicStructureUncheckedUInt64<Fiel

python实现马耳可夫链算法实例分析

  本文实例讲述了python实现马耳可夫链算法的方法.分享给大家供大家参考.具体分析如下: 在<程序设计实践>(英文名<The Practice of Programming>)的书中,第三章分别用C语言,C++,AWK和Perl分别实现了马耳可夫链算法,来通过输入的文本,"随机"的生成一些有用的文本. 说明: 1. 程序使用了字典,字典和散列可不是一个东西,字典是键值对的集合,而散列是一种能够常数阶插入,删除,不过可以用散列来实现字典. 2. 字典的setd

php-perl哈希算法实现

 php-perl哈希实现算法–DJBX33A(Daniel J. Bernstein, Times 33 with Addition)APR哈希默认算法  代码如下: APR_DECLARE_NONSTD(unsigned int) apr_hashfunc_default(const char *char_key,                                                       apr_ssize_t *klen) {     unsigned i

openssl使用DSA算法生成签名

  命令: openssl> dgst -dss1 -sign C.pri -out signature.bin s.txt 解释 C.pri是DSA算法生成的私钥文件 s.txt是制作签名的原文 signature.bin是生成的签名文件 php中可以使用下面的方法察看签名内容  代码如下   <?php echo bin2hex(file_get_contents('signature.bin')); ?> 参考内容 消息摘要算法 支持的算法包括:MD2, MD4, MD5, MDC