Mercurial > hg > Game > Cerium
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; } }