LINUX.ORG.RU

хеши


0

0

Здравствуйте. У меня такой вопрос: в Си можно работать с хешами? Просто везде говорится только про перл, а по Си на эту тему не удалось найти никакой документации. Буду благодарен за ссылочку.

anonymous
Ответ на: комментарий от lg

В смысле, синтаксис абсолютно одинаковый?

anonymous
()

не понял че за синтаксис?
вот тебе пример hasha может поможет разобраться:
/*
 * (c) lg
 * NOT TESTED! USER ON OUR OWN RISK!
 */
#define HASH_SIZE 256
#defene HASH_KEY(x, y)  (((x)^(y)) & (HASH_SIZE - 1))

struct my_hash {
  int x;
  int y;
  void *data;
  TAILQ_ENTRY(my_hash) next;
};

TAILQ_HEAD(hash_tqh, my_hash) myownn_hash_table[HASH_SIZE];

/*
 * Инициализировать hash
 */
void
hash_init(void)
{
   int i;

   for (i = 0; i < HASH_SIZE; i++)
       TAILQ_INIT(&myown_hash_table[i]);
}

/*
 * Найти элемент в hashе
 */
struct my_hash*
find_elem(int x, int y)
{
     struct my_hash *mh;
     unsigned hash = HASH_KEY(x, y);

     TAILQ_FOREACH(mh, &myown_hash_table[hash], next) {
         if ((x == mh->x) &&
             (y == mh->y))
          {
             /* XXX */
             return mh;
          }
     }
     return NULL;
}

lg ★★
()

>в Си можно работать с хешами?

Если станет лениво изобретать велосипед - возьми с++ :
(пример с http://www.sgi.com/tech/stl/hash_map.html)
#include <iostream>
#include <hash_map>

struct eqstr
{
  bool operator()(const char* s1, const char* s2) const
  {
    return strcmp(s1, s2) == 0;
  }
};

int main ()
{
  hash_map<const char*, int, hash<const char*>, eqstr> months;
  
  months["january"] = 31;
  months["february"] = 28;
  months["march"] = 31;
  months["april"] = 30;
  months["may"] = 31;
  months["june"] = 30;
  months["july"] = 31;
  months["august"] = 31;
  months["september"] = 30;
  months["october"] = 31;
  months["november"] = 30;
  months["december"] = 31;
  
  cout << "september -> " << months["september"] << endl;
  cout << "april     -> " << months["april"] << endl;
  cout << "june      -> " << months["june"] << endl;
  cout << "november  -> " << months["november"] << endl;
  return 0;
}

anonymous
()

Ребяты, юзайте STL, шоб вооще ниччо не нада было изобретать :))

solom
()

Hi, Solom

>Ребяты, юзайте STL, шоб вооще ниччо не нада было изобретать :))

с каких пор STL содержит hash?

http://www.sgi.com/tech/stl/hash_map.html:

Defined in the header hash_map, and in the backward-compatibility header hash_map.h. This class is an SGI extension; it is not part of the C++ standard.

anonymous
()

Ежели чисто С - юзай glib. Там не только хеша, а ещё много разных вкусностей (типа списков и т.д.)

kpanic ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.