Пытаюсь понять логику кода получения хэша.
int __fastcall mt::String::getHashCode(const char *a1)
{
const char *originalName; // r4@1
size_t nameLenght; // r0@1
int originalNamePtr; // r2@1
unsigned int nameLenghtTMP; // r3@2
int result; // r0@2
int v6; // t1@3
originalName = a1;
nameLenght = strlen(a1);
originalNamePtr = *originalName;
if ( *originalName )
{
nameLenghtTMP = nameLenght;
result = 0;
do
{
result += originalNamePtr * nameLenghtTMP;
v6 = (originalName++)[1];
originalNamePtr = v6;
nameLenghtTMP = (nameLenghtTMP >> 16) + 18000 * (unsigned __int16)nameLenghtTMP;
}
while ( v6 );
}
else
{
result = *originalName;
}
return result;
}
С учетом не настолько глубоких познаний с++ до конца не понимаю всю магию происходящего.
Конкретно интересует следующее:
1) if ( *originalName ) при каких условиях оно срабатывает\не срабатывает.
2) while ( v6 ) как оно считает что пора бы и закончить?
3) v6 = (originalName++)[1] я так понимаю что тут берется первый элемент из originalName?
4) unsigned __int16 есть ли аналог этому типу в jav'е?
PS: переписываю часть кода на джаве, для многих моментов хватает имеющихся знаний о с++ но вот для таких как выше увы =(