jamakasi666
@jamakasi666
Просто IT'шник.

Помощь в объяснении логики функции?

Пытаюсь понять логику кода получения хэша.
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: переписываю часть кода на джаве, для многих моментов хватает имеющихся знаний о с++ но вот для таких как выше увы =(
  • Вопрос задан
  • 286 просмотров
Решения вопроса 2
@aol-nnov
про истинность и ложность:
1 == true
100500 == true
0 == false
NULL == false
итд.

1) срабатывает, когда значение в ячейке, на которую указывает originalName истино
2) см про истиность и ложность
3) двигаем указатель на следующую ячейку, берем смещение +1, получаем второй элемент от начала. см. адресная арифметика
4) byte[2]?
Ответ написан
Комментировать
@Free_ze
Пишу комментарии в комментарии, а не в ответы
1) if ( *originalName ) при каких условиях оно срабатывает\не срабатывает.

Срабатывает, когда значение под указателем отличается от 0, не срабатывает - в противном случае.

2) while ( v6 ) как оно считает что пора бы и закончить?

Когда значение v6 становится равно 0.

3) v6 = (originalName++)[1] я так понимаю что тут берется первый элемент из originalName?

Второй элемент, относительно текущей позиции указателя originalName (до инкремента).

4) unsigned __int16 есть ли аналог этому типу в jav'е?

Прямых аналогов нет (беззнаковых типов в принципе), но long вместит все его значения.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы