#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

MODULE = Algorithm::StringHash::FromCSharp35::XS		PACKAGE = Algorithm::StringHash::FromCSharp35::XS		

unsigned int GetHashCode(const char * str)
CODE:
    unsigned int    num = 0x15051505;
    unsigned int    num2 = num;
    int length=strlen(str);

    int new_length = length + ( 8 - length % 8) + 128;
    char chPtr[new_length];
    memset(chPtr,0,new_length);
    strcpy(chPtr,str);

    unsigned int  * numPtr = (unsigned int *)chPtr;
    int i=0;
    for(i=length;i>0;i-=4)
    {
        num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
        if(i<=2) break;
        num2=(((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
        numPtr+=2;
    }
    unsigned int ret = (num + (num2 * 0x5d588b65));
    RETVAL = ret;
OUTPUT:
    RETVAL