![]() |
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here. |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Print Entire hash list (hash of hashes) | Alalush | Shell Programming and Scripting | 1 | 08-06-2008 08:40 AM |
| Awk Hash Function. | dinjo_jo | Shell Programming and Scripting | 2 | 07-16-2008 06:30 PM |
| Locality Sensitive Hash Function Based on Concomitant Rand Order Statistics | iBot | UNIX and Linux RSS News | 0 | 07-07-2008 05:10 AM |
| Passing global variable to a function which is called by another function | sars | Shell Programming and Scripting | 4 | 06-30-2008 11:39 AM |
| dmidecode, RAM speed = "Current Speed: Unknown" | Santi | Filesystems, Disks and Memory | 0 | 02-16-2006 06:16 AM |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Hash Function Speed
I have created my own hash table class, but am looking to speed it up. My current hash function is:
Code:
int HashTable::hashFunc(const string &key) const
{
int tableSize = theLists.size();
int hashVal = 0;
for(int i = 0; i<key.length(); i++)
hashVal = 37*hashVal+key[i];
hashVal %= tableSize;
if(hashVal<0)
hashVal += tableSize;
return hashVal;
}
|
|
||||
|
Your hash function is, um, unusual. Your for loop does nothing. Assuming that is what you really wanted, this is what you function is actually doing:
Code:
int HashTable::hashFunc(const string &key) const
{
int tableSize = theLists.size();
int hashVal = 0;
hashVal = 37*hashVal+key[key.length()];
return hashVal % tableSize;
}
|
|
||||
|
Are you sure of that? The indenting looks almost random, but if you ignore it, the loop looks like it should iterate over the line below it, modifying the value of hashVal further for every character in the key string.
|
|
||||
|
It is missing { }, IMO.
---------- Post updated at 09:09 ---------- Previous update was at 09:07 ---------- Code:
int HashTable::hashFunc(const string &key) const
{
int tableSize = theLists.size();
int hashVal = 0;
for(int i = 0; i<key.length(); i++) {
hashVal = 37*hashVal+key[i];
hashVal %= tableSize;
if(hashVal<0)
hashVal += tableSize;
}
return hashVal;
}
|
|
||||
|
Without { }, the loop will operate on the following statement instead of the following code block. If the loop had a semicolon on the end, then it would be truly pointless. Try the following code:
Code:
int n;
for(n=0; n<10; n++)
printf("loop A %d\n", n);
for(n=0; n<10; n++);
printf("loop B %d\n", n);
---------- Post updated at 09:34 AM ---------- Previous update was at 09:10 AM ---------- As for improving the hash function, there's not a lot to it as is. Slowdowns may be coming from other things. How full are your hash tables, how many collisions are you getting? Last edited by Corona688; 4 Weeks Ago at 11:16 AM.. |
|
||||
|
As to hash improvement in general - test avalanche/distribution for your data sets on these:
Code:
// XOR-Bernstein hash
unsigned xor_b_hash ( const void *key,
const int len,
const unsigned tablesize )
{
const unsigned char *p = (const unsigned char *)key;
unsigned hval = 0;
int i=0;
for ( i = 0; i < len; i++, p++ )
hval = 33 * hval ^ *p;
return hval % tablesize;
}
// fowler/nol/vo hash
unsigned fnv_hash ( const void *key,
const int len,
const unsigned tablesize )
{
const unsigned char *p = (const unsigned char *)key;
unsigned hval = 2166136261U;
int i=0;
for ( i = 0; i < len; i++, p++ )
hval = ( hval * 16777619 ) ^ *p;
return hval % tablesize;
}
And if the original hash is "slow", then so will these be. Did you try instrumtenting your code, or using a profiler? ...before you decided the hash algorithm was the bottleneck. |
|
||||
|
Quote:
Code:
hash("xyz") == 943
hash("zyx") == 1631
hash("xzy") == 979
|
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|