Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Хэширование строк c++  (Прочитано 1399 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pit2332

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Хэширование строк c++
« : 23 Апреля 2012, 15:54:11 »
Доброе время суток!
Пишу программу для хэширования строк (свёртка 2).
Код: (cpp) [Выделить]
#include <iostream>
#include <string.h>

using namespace std;

int hash_calc_sv2(char x[],const int size)
{
cout<<x<<" ";
int StringLength,HashKey,i,tmp;
StringLength=strlen(x); //Начало вычисления ключа
HashKey=0;
if (StringLength%2==0) //Чётный случай
{
cout<<"Ч ";
for (i=0; i<StringLength; i=i+2)
{
tmp=x[i];
tmp=tmp*1000;
tmp=tmp+x[i+1];
HashKey=HashKey+tmp;
}
}
if (StringLength%2!=0) //Нечётный случай
{
cout<<"Н ";
for (i=1; i<=StringLength; i=i+2)
{
tmp=x[i];
tmp=tmp*1000;
tmp=tmp+x[i+1];
HashKey=HashKey+tmp;
}
HashKey=HashKey+x[0];
} //конец вычисления ключа
//cout<<HashKey<<"\n";
return (HashKey);
}

int main(void)
{
int N=19;
char st[N][10];
int j,k,keyd[N],ht[N],ArrOfSin[N];

strcpy(st[0],"zero");
    strcpy(st[1],"one");
    strcpy(st[2],"two");
    strcpy(st[3],"three");
    strcpy(st[4],"four");
    strcpy(st[5],"five");
    strcpy(st[6],"six");
    strcpy(st[7],"seven");
    strcpy(st[8],"eight");
    strcpy(st[9],"nine");
    strcpy(st[10],"ten");
    strcpy(st[11],"eleven");
    strcpy(st[12],"twelve");
    strcpy(st[13],"thirteen");
    strcpy(st[14],"fourteen");
    strcpy(st[15],"fifteen");
    strcpy(st[16],"sixteen");
    strcpy(st[17],"seventeen");
    strcpy(st[18],"eighteen");
    strcpy(st[19],"nineteen");
   
    for (j=0; j<N; j++)
    {
keyd[j]=hash_calc_sv2(st[j],strlen(st[j]));
cout<<keyd[j]<<"\n";
    }
   
}
Хэш код всех строк считает правильно, за исключением двух. Это "three" и "six". Выдаёт каждый раз разное значение.
Тут представил вывод программы при каждом запуске (номер столбца - номер запуска)

zero Ч 236212       zero Ч 236212   zero Ч 236212
one Н 110212       one Н 110212   one Н 110212
two Н 119227        two Н 119227   two Н 119227
three Н 205236       three Н 205220   three Н 205240
four Ч 219225       four Ч 219225   four Ч 219225
five Ч 220206       five Ч 220206   five Ч 220206
six Н 105139       six Н 105107   six Н 105315
seven Н 202343       seven Н 202343   seven Н 202343
eight Н 209320       eight Н 209320   eight Н 209320
nine Ч 220206       nine Ч 220206   nine Ч 220206
ten Н 101232       ten Н 101232   ten Н 101232
eleven Ч 303336       eleven Ч 303336   eleven Ч 303336
twelve Ч 335328       twelve Ч 335328   twelve Ч 335328
thirteen Ч 438429   thirteen Ч 438429   thirteen Ч 438429
fourteen Ч 436436   fourteen Ч 436436   fourteen Ч 436436
fifteen Н 322415    fifteen Н 322415   fifteen Н 322415
sixteen Н 322426    sixteen Н 322426   sixteen Н 322426
seventeen Н 419655  seventeen Н 419655   seventeen Н 419655
eighteen Ч 421420   eighteen Ч 421420   eighteen Ч 421420



Попробовал осуществить всё без функции - считает однозначно. В чём проблема?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5626
  • Все по палатам!
    • Просмотр профиля
Re: Хэширование строк c++
« Ответ #1 : 23 Апреля 2012, 16:14:42 »
int N=20;
И здесь проверить
for (i=1; i<=StringLength; i=i+2)
Может надо <
И это
tmp=tmp+x[i+1]; за пределы массива уходит
« Последнее редактирование: 23 Апреля 2012, 16:21:39 от SergeyIT »
Извините, я все еще учусь

Оффлайн pit2332

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Хэширование строк c++
« Ответ #2 : 23 Апреля 2012, 16:32:33 »
На самом деле вроде бы помогло. Вот только ещё прогоню на всякий случай по большому разнообразию строк. Спасибо)

 

Страница сгенерирована за 0.075 секунд. Запросов: 26.