当前位置:  编程技术>php

PHP HASH算法实现代码分享

    来源: 互联网  发布时间:2014-10-07

    本文导语:  例子,php hash算法的实现代码。   代码示例: /*  * 头文件  * 说明:此实现不保存对象,只保存对象的引用  */ #ifndef _HASH_H #define _HASH_H #ifdef __cplusplus extern "C" { #endif typedef struct tagHASHBUCKET HASHBUCKET, *LPHASHBUCKET; typedef struct ...

例子,php hash算法的实现代码。
 

代码示例:

/*
 * 头文件
 * 说明:此实现不保存对象,只保存对象的引用
 */
#ifndef _HASH_H
#define _HASH_H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct tagHASHBUCKET HASHBUCKET, *LPHASHBUCKET;
typedef struct tagHASHTABLE HASHTABLE, *LPHASHTABLE;

struct tagHASHBUCKET
{
    unsigned long h;
    unsigned int key_length;
    void *data;
    LPHASHBUCKET next;
    LPHASHBUCKET previous;
    LPHASHBUCKET conflict_next;
    LPHASHBUCKET conflict_previous;
    char key[1];
};

typedef unsigned long (*hash_func_t)(char *, unsigned int);

struct tagHASHTABLE
{
    unsigned int table_size;
    unsigned int size_index;
    unsigned int elements;
    hash_func_t hash;
    LPHASHBUCKET p;
    LPHASHBUCKET head;
    LPHASHBUCKET tail;
    LPHASHBUCKET *buckets;
};

extern int hash_create(LPHASHTABLE, unsigned int, hash_func_t);
extern int hash_entry(LPHASHTABLE, char *, unsigned int, void *);
extern int hash_find(LPHASHTABLE, char *, unsigned int, void **);
extern int hash_update(LPHASHTABLE, char *, unsigned int, void *);
extern int hash_remove(LPHASHTABLE, char *, unsigned int);
extern int hash_destroy(LPHASHTABLE);

#ifdef __cplusplus
};
#endif

#endif

/*
 * HASH实现
 */
#include
#include
#include "main.h"

static unsigned int size_table[] =
    {5, 11, 19, 53, 107, 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793, 2097397, 41941
03, 8388857, 16777447, 33554201, 67108961, 134217487, 268435697, 536870683, 1073741621, 2147483399};
#define COUNTS_OF_SIZE_TABLE    (sizeof(size_table) / sizeof(size_table[0]))

static unsigned long
hashpjw(char *key, unsigned int key_length)
{
    unsigned long h, g;
    char *p;

    h = 0;
    p = key + key_length;
    while (key < p)
    {
        h = (h > 24);
            h = h ^ g;
        }
    }

    return h;
}

static int
hash_do_rehash(LPHASHTABLE pht)
{
    LPHASHBUCKET p;
    unsigned int index;

    memset(pht->buckets, 0, sizeof(LPHASHBUCKET) * size_table[pht->size_index]);
    for (p = pht->head; p; p = p->next)
    {
        index = p->h % pht->table_size;
        p->conflict_next = 0;
        p->conflict_previous = pht->buckets[index];
        if (p->conflict_previous)
        {
            p->conflict_previous->conflict_next = p;
        }
        pht->buckets[index] = p;
    }

    return 0;
}

static int
hash_do_resize(LPHASHTABLE pht)
{
    LPHASHBUCKET *pp;

    if (pht->size_index < (unsigned int)COUNTS_OF_SIZE_TABLE - 1)
    {
        pp = (LPHASHBUCKET *)realloc(pht->buckets, size_table[pht->size_index + 1] * sizeof(LPHASHBUCKET));
        if (pp)
        {
            pht->buckets = pp;
            pht->size_index++;
            pht->table_size = size_table[pht->size_index];
            hash_do_rehash(pht);
            return 0;
        }
        return -1;
    }

    return 0;
}

int
hash_create(LPHASHTABLE pht, unsigned int size, hash_func_t hash)
{
    int i;

    for (i = 0; i < COUNTS_OF_SIZE_TABLE; ++i)
    {
        if (size size_index = i;
            break;
        }
    }
    if (i == COUNTS_OF_SIZE_TABLE)
    {
        size = size_table[COUNTS_OF_SIZE_TABLE - 1];
        pht->size_index = COUNTS_OF_SIZE_TABLE - 1;
    }

    pht->buckets = (LPHASHBUCKET *)calloc(size, sizeof(LPHASHBUCKET));
    if (!pht->buckets)
    {
        return -1;
    }
    pht->hash = hash? hash: hashpjw;
    pht->elements = 0;
    pht->head = 0;
    pht->p = 0;
    pht->tail = 0;
    pht->table_size = size;

    return 0;
}

int
hash_entry(LPHASHTABLE pht, char *key, unsigned int key_length, void *data)
{
    unsigned long h;
    unsigned int index;
    LPHASHBUCKET p;

    h = pht->hash(key, key_length);
    index = h % pht->table_size;

    for (p = pht->buckets[index]; p; p = p->conflict_previous)
    {
        if (p->h == h && p->key_length == key_length)
        {
            if (!memcmp(p->key, key, key_length))
            {
                return -1;
            }
        }
    }

    p = (LPHASHBUCKET)malloc(sizeof(HASHBUCKET) - 1 + key_length);
    if (!p)
    {
        return -1;
    }
    memcpy(p->key, key, key_length);
    p->key_length = key_length;
    p->h = h;
    p->data = data;

    p->conflict_next = 0;
    p->conflict_previous = pht->buckets[index];
    if (p->conflict_previous)
    {
        p->conflict_previous->conflict_next = p;
    }
    p->previous = pht->tail;
    p->next = 0;
    pht->tail = p;
    if (p->previous)
    {
        p->previous->next = p;
    }
    if (!pht->head)
    {
        pht->head = p;
    }

    pht->buckets[index] = p;
    ++pht->elements;
    if (pht->elements > pht->table_size)
    {
        hash_do_resize(pht);
    }

    return 0;
}

int
hash_find(LPHASHTABLE pht, char *key, unsigned int key_length, void **data)
{
    unsigned long h;
    unsigned int index;
    LPHASHBUCKET p;

    h = pht->hash(key, key_length);
    index = h % pht->table_size;

    for (p = pht->buckets[index]; p; p = p->conflict_previous)
    {
        if (p->h == h && p->key_length == key_length && !memcmp(p->key, key, key_length))
        {
            *data = p->data;
            return 0;
        }
    }

    return -1;
}

int
hash_remove(LPHASHTABLE pht, char *key, unsigned int key_length)
{
    unsigned long h;
    unsigned int index;
    LPHASHBUCKET p;

    h = pht->hash(key, key_length);
    index = h % pht->table_size;

    for (p = pht->buckets[index]; p; p = p->conflict_previous)
    {
        if (p->h == h && p->key_length == key_length && !memcmp(p->key, key, key_length))
        {
            if (p->conflict_previous)
            {
                p->conflict_previous->conflict_next = p->conflict_next;
            }
            if (p->conflict_next)
            {
                p->conflict_next->conflict_previous = p->conflict_previous;
            }
            if (p->previous)
            {
                p->previous->next = p->next;
            }
            if (p->next)
            {
                p->next->previous = p->previous;
            }
            if (pht->buckets[index] == p)
            {
                pht->buckets[index] = p->conflict_previous;
            }
            if (pht->head == p)
            {
                pht->head = p->next;
            }
            if (pht->tail == p)
            {
                pht->tail = p->previous;
            }
            --pht->elements;
            free(p);

            return 0;
        }
    }

    return -1;
}

int
hash_update(LPHASHTABLE pht, char *key, unsigned int key_length, void *data)
{
    unsigned long h;
    unsigned int index;
    LPHASHBUCKET p;

    h = pht->hash(key, key_length);
    index = h % pht->table_size;

    for (p = pht->buckets[index]; p; p = p->conflict_previous)
    {
        if (p->h == h && p->key_length == key_length && !memcmp(p->key, key, key_length))
        {
            p->data = data;
            return 0;
        }
    }

    return -1;
}

int
hash_destroy(LPHASHTABLE pht)
{
    LPHASHBUCKET p, q;

    p = pht->head;
    while (p)
    {
        q = p;
        p = p->next;
        free(q);
    }
    free(pht->buckets);

    return 0;
}


    
 
 

您可能感兴趣的文章:

  • php质数算法代码 php除法求质数
  • php微博短网址算法 php生成短网址的实现代码
  • PHP中对各种加密算法、Hash算法的速度测试对比代码
  • php加密算法之实现可逆加密算法和解密分享
  • php生成数组的使用示例 php全组合算法
  • php生成数组与php全组合算法
  • php质数算法简单示例
  • PHP 素数计算算法示例
  • PHP5入门之分组算法
  • php冒泡排序算法实现代码
  • php选择排序算法实现代码
  • php递归算法 php递归函数无限级分类
  • php实现信用卡校验位算法THE LUHN MOD-10示例
  • 一组PHP可逆加密解密算法实例代码
  • php排序算法 PHP版快速排序与冒泡排序
  • 又一个PHP实现的冒泡排序算法分享
  • PHP折半(二分)查找算法的实现代码
  • php hash算法实例分享
  • PHP递归算法实例解析
  • php递归算法应用实例
  • php通过socket_bind()设置IP地址代码示例
  • PHP代码格式化 php.fmt
  • PHP去除html标签,php标记及css样式代码参考
  • PHP获取php,mysql,apche的版本信息示例代码
  • php session_id()函数介绍及代码实例
  • php判断字符串是否存在 php字符串检测代码
  • php将html特殊字符转换成html字符串的函数:htmlspecialchars()介绍及代码举例
  • php 质数计算代码 PHP筛选法求质数
  • php实现socket实现客户端和服务端数据通信源代码
  • php解压文件代码实现php在线解压
  • php获取访客ip地址原理及提供七段代码供参考
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • PHP实现Unicode和Utf-8互相转换
  • PHP实现的AMQP php-amqplib
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • php通过数组实现多条件查询实现方法(字符串分割)
  • NOSQL iis7站长之家
  • PHP快速排序小例子 php快速排序实现方法
  • PHP实现获取图片颜色值的方法
  • php 通配符实现方法
  • php实现的九九乘法口诀表简洁版
  • PHP扩展实现的框架 ZoeeyPHP
  • PHP 语言实现 HippyVM
  • php实现斐波那契数列的简单写法
  • 如何实现类似PHP.PB等语言中eval的函数功能?
  • PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
  • apache配置php实现单一入口方法
  • 如何用php实现IP访问限制
  • php实现建立多层级目录的方法
  • php实现数组筛选奇数和偶数示例
  • php 异步请求文件实现多线程的代码
  • php中操作memcached缓存进行增删改查数据的实现代码
  • linux下使用crontab实现定时PHP计划任务失败的原因分析
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • php输入流php://input使用示例(php发送图片流到服务器)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP转换器 HipHop for PHP
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • PHP 框架 Pop php
  • php安装完成后如何添加mysql扩展
  • PHP的JavaScript框架 PHP.JS


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3