calchash + c + макрос

Тема в разделе "LANGS.C", создана пользователем apx, 19 авг 2008.

  1. apx

    apx New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2008
    Сообщения:
    25
    Я думаю многим известнен макрос, понимаемый многими asm-компиляторами
    calchash macro procname
    hash = 0
    irpc c, <procname>
    hash = ((hash shl 15) and 0FFFFFFFFh) or (hash shr (32-15))
    hash = hash xor "&c"
    endm
    endm

    Возможно ли сделать подобный макрос для с-компиляторов, дял того что-бы строка не была в секции данных
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Возможно, тока что проверил.
     
  3. apx

    apx New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2008
    Сообщения:
    25
    Эээ, если не трудно и нет ничего секретного, можно ли его привести? Можно даже подобный.
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    1) либо написать стандартный макрос на ANSI C;
    2) либо использовать Boost.Preprocessor (у меня не получилось перевести макрос "один в один", подозреваю что с этими макросами можно так сделать)
    3) написать какой-нибудь скрипт на perl'e/python'e/what else, к-рый будет в pre-build'e находить все строки и "превращять" их в хеши.
     
  5. apx

    apx New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2008
    Сообщения:
    25
    По мне так скрипт на актив перле и есть выход. Просто думал это просто "либо написать стандартный макрос на ANSI C", хотя для мена не просто такой макрос сделать, без добавления в секцию данных самой строки непосредсвенно.
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Пора читать книги по С?
     
  7. apx

    apx New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2008
    Сообщения:
    25
    Может и пора, но реально не выходит, без добавления некого кода или самой строки в секцию данных, я не знаю таких механизмов препроцессора с/c++ равнозначных препроцессору masm
    hash = 0
    irpc c, <procname>
    hash = ((hash shl 15) and 0FFFFFFFFh) or (hash shr (32-15))
    hash = hash xor "&c"
    endm
    endm
    Так что если знаете, дорогой censored уж подскажите.
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. #define MY_GET_NAME1(a)      ((((#@a)<<15) & 0xffffffff) | (#@a>>(32-15)))
    5. #define MY_GET_NAME2(a,b)    MY_GET_NAME1(a) ^ MY_GET_NAME1(b)
    6. #define MY_GET_NAME3(a,b,c)  MY_GET_NAME2(a,b) ^ MY_GET_NAME1(c)
    7. ...
    8. #define MY_GET_NAME33(a,b,c,d,...)
    9.  
    10. unsigned long calchash(const char *string) {
    11.   unsigned long hash = 0;
    12.   size_t i, len = strlen(string);
    13.   for (i = 0; i < len; ++i) {
    14.     hash ^= ((string[i] << 15) & 0xffffffff) | (string[i] >> (32 - 15));
    15.   }
    16.   return hash;
    17. }
    18.  
    19. void main() {
    20.   unsigned long h1;
    21.   unsigned long h2;
    22.  
    23.   h1 = MY_GET_NAME3(a,b,c);
    24.   h2 = calchash("abc");
    25.  
    26.   printf("h1 = %p\nh2 = %p\n", h1, h2);
    27. }
    Хэш плохой, но это просто пример.