Yo ya la estuve viendo.
#include <iostream>
#include <string.h>
using namespace std;
int64_t calc_hash(char *szString);
void ReverseString(char *szString);
int main()
{
char szTestString[1000000];
memset(szTestString, 'a', 100000);
cout << calc_hash(szTestString);
return 0;
}
int64_t calc_hash(char *szString)
{
int64_t hash = 0;
ReverseString(szString);
unsigned long n = 1;
long i = 1;
for (i = 0; i < strlen(szString); i++)
{
hash = hash + szString[i] * n;
n = n * 33;
}
hash = hash + n*5381;
return hash;
}
void ReverseString(char *szString)
{
char *szOutString = new char[strlen(szString)];
for(unsigned long i = 0 ; i < strlen(szString); i++)
{
szOutString[strlen(szString) - i - 1] = szString[i];
if(i%10000 == 0) cout << i << endl;
}
szOutString[strlen(szString)] = 0;
strcpy(szString, szOutString);
delete szOutString;
}
Ese es un equivalente en C++.
Igual, hay muchas cosas que lo descalifican como hash.
Overflowea facilmente con un input lo suficientemente grande y el tamaño de la salida es proporcional al tamaño de la entrada, aparte de que no da los mismos hashes.