view Renderer/Engine/TextureHash.cc @ 1087:20f09564c586 draft

fix (not yet tested)
author root@localhost.localdomain
date Fri, 17 Dec 2010 18:34:29 +0900
parents 3bc98f6d31ff
children ee481853d5dd
line wrap: on
line source

#include <string.h>
#include <stdlib.h>
#include "TextureHash.h"

static int id_count;

TextureHash::TextureHash(void)
{
    int size = sizeof(hashtable)*TABLE_SIZE;
#if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN)
        table =  (hashtable*)malloc(size);
#else
        posix_memalign((void**)&table, alignment, size);
#endif
    for (int i = 0; i < TABLE_SIZE; i++) {
        table[i].tx_id = -1;
        table[i].key = NULL;
    }
}

TextureHash::~TextureHash(void)
{
    free(table);
}

int
TextureHash::hash_function(const char *key)
{
    //float value = 0.0;
    int value = 0;

    for (int i = 0; key[i]; i++) {
        value += key[i]*(i+1)*17+1;
    }

    return value%TABLE_SIZE;
}

int
TextureHash::hash_regist(const char* key, int &id)
{
    int hash = hash_function(key);

    for (int i = 0; ; i++) {
        if (table[hash].tx_id == -1) {
            table[hash].key   = (char*)key;
            id = id_count++;
            return 0;

        } else if (strcmp(key, table[hash].key) == 0
                   && table[hash].tx_id != -1){
            id = table[hash].tx_id;
            return 1;
        }
        hash = ((37*hash)^(11*i)) % TABLE_SIZE;
    }
}