Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> string hashing in compile-time, хеш 
V
    Опции темы
boostcoder
Дата 14.2.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(GoldFinch @  14.2.2011,  01:28 Найти цитируемый пост)
const char (&str)[N]

значит я правильно понял что mes имел ввиду.
PM WWW   Вверх
mes
Дата 14.2.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  14.2.2011,  00:10 Найти цитируемый пост)
 потому что Струструп так сказал

спс smile

Цитата(boostcoder @  14.2.2011,  00:23 Найти цитируемый пост)
ваш код скомпилился только после такой поправки:

а ну да.. но для первого раза пойдет..  ну как терь сделать hash функцию нашли ? 


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 14.2.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



ну вот, осталось хеш сделать....
PM MAIL ICQ   Вверх
boostcoder
Дата 14.2.2011, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  14.2.2011,  01:32 Найти цитируемый пост)
ну как терь сделать hash функцию нашли ?

есть идеи. буду пробовать smile

Цитата(GoldFinch @  14.2.2011,  01:32 Найти цитируемый пост)
ну вот, осталось хеш сделать.... 

угу.
и привязать пользователей к будущему стандарту smile

Это сообщение отредактировал(а) boostcoder - 14.2.2011, 01:34
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



время позднее, ничего умнее макроса который будет раскрываться в копипасту мне на ум не приходит.

Добавлено через 2 минуты и 53 секунды
хотя есть вариант передавать строку как значение...
PM MAIL ICQ   Вверх
mes
Дата 14.2.2011, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  14.2.2011,  00:34 Найти цитируемый пост)
и привязать пользователей к будущему стандарту

тут два вопроса возникают..
1. до сих пор не вижу как защитит типизацию Вас компил-тайм хэш..
2. что мешает, для остальных компилятор использовать более неудобное представление ?



--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 14.2.2011, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Код

typedef unsigned long size_t;

struct hash
{
    static constexpr unsigned f(unsigned prevHash, char nextChar) // FNV1-a
    { 
        return nextChar ? unsigned((prevHash ^ nextChar) * 16777619u) : prevHash;
    }

    template <size_t N>
    static constexpr unsigned calc(const char (&s)[N])
    {
        return f(f(f(f( f(f(f(f( 2166136261u
            , s[0]), s[1]), s[2]), s[3]), s[4]), s[5]), s[6]), s[7])
            ;
    }    
};

#define HASH(str) hash::calc(str "\0\0\0\0" "\0\0\0\0")

template <unsigned N> struct identity { static const unsigned value = N; };

int main()
{
    return (int)identity<HASH("123")>::value;
}

слава копипасте...

Добавлено через 4 минуты и 5 секунд
Цитата(boostcoder @  14.2.2011,  01:34 Найти цитируемый пост)
и привязать пользователей к будущему стандарту smile

для меня он уже настоящий
(правда в пределах MSVC2010 =\ )

Это сообщение отредактировал(а) GoldFinch - 14.2.2011, 01:52
PM MAIL ICQ   Вверх
boostcoder
Дата 14.2.2011, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



GoldFinch, а есть идеи, как избавиться от макроса?
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



нормальных - пока нету
PM MAIL ICQ   Вверх
boostcoder
Дата 14.2.2011, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



хватит на сегодня. спать. всем спасибо и сн.
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



просто считайте что его там нет.
(наверное это самое эффективное решение)
PM MAIL ICQ   Вверх
boostcoder
Дата 14.2.2011, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



GoldFinch, а в микрософтстудии constexpr реализован?
PM WWW   Вверх
GoldFinch
Дата 14.2.2011, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



boostcoder, неа, там вообще мало что реализовано,
лямбды, auto, decltype, r-value references
PM MAIL ICQ   Вверх
mes
Дата 14.2.2011, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  14.2.2011,  01:10 Найти цитируемый пост)
 как избавиться от макроса

Код

template <size_t N>
constexpr size_t f() { return N *  f<N-1>(); }

template <>
constexpr size_t f<0>() { return 1; }


int main()
{
   std::cout << f<6>();
}

этот код работает ? тогда можно используя рекурсию шаблонов, создать хэш-итератор..
smile

Это сообщение отредактировал(а) mes - 14.2.2011, 02:55


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 14.2.2011, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  14.2.2011,  02:55 Найти цитируемый пост)
этот код работает ?

да smile

Цитата(mes @  14.2.2011,  02:55 Найти цитируемый пост)
тогда можно используя рекурсию шаблонов, создать хэш-итератор..

можно подробнее? ;)

Добавлено через 1 минуту и 18 секунд
расширил возможность использовать до 64ех символов.
вроде длинее быть не должно smile
Код

#include <iostream>

struct hash {
   static constexpr size_t f(size_t prevHash, char nextChar) { // FNV1-a 
      return nextChar ? size_t((prevHash ^ nextChar) * 16777619u) : prevHash;
   }
   template <size_t N>
   static constexpr size_t calc(const char (&s)[N]) {
      static_assert(N<130, "maximum 64 symbols allowed!");
      return
         f(f(f(f
            (f(f(f(f
               (f(f(f(f
                  (f(f(f(f(
                     f(f(f(f(
                        f(f(f(f
                           (f(f(f(f
                              (f(f(f(f(
                                 f(f(f(f(
                                    f(f(f(f
                                       (f(f(f(f
                                          (f(f(f(f
                                             (f(f(f(f
                                                (f(f(f(f(
                                                   f(f(f(f(
                                                      f(f(f(f(2166136261u
                                                      , s[0]), s[1]), s[2]), s[3])
                                                      , s[4]), s[5]), s[6]), s[7])
                                                      , s[8]), s[9]), s[10]), s[11])
                                                      , s[12]), s[13]), s[14]), s[15])
                                                      , s[16]), s[17]), s[18]), s[19])
                                                      , s[20]), s[21]), s[22]), s[23])
                                                      , s[24]), s[25]), s[26]), s[27])
                                                      , s[28]), s[29]), s[30]), s[31])
                                                      , s[32]), s[33]), s[34]), s[35])
                                                      , s[36]), s[37]), s[38]), s[39])
                                                      , s[40]), s[41]), s[42]), s[43])
                                                      , s[44]), s[45]), s[46]), s[47])
                                                      , s[48]), s[49]), s[50]), s[51])
                                                      , s[52]), s[53]), s[54]), s[55])
                                                      , s[56]), s[57]), s[58]), s[59])
                                                      , s[60]), s[61]), s[62]), s[63])
      ;
   }    
};

#define HASH(str) \
   hash::calc(str \
      "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" \
      "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" \
      "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" \
      "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\0" \
   )
template <size_t N>
struct identity {
   static const size_t value = N;
};
int main() {
   std::cout << identity<HASH("1")>::value << std::endl;
   std::cout << identity<HASH("11")>::value << std::endl;
   std::cout << identity<HASH("111")>::value << std::endl;
   std::cout << identity<HASH("1111")>::value << std::endl;

   std::cout << identity<HASH("11111")>::value << std::endl;
   std::cout << identity<HASH("111111")>::value << std::endl;
   std::cout << identity<HASH("1111111")>::value << std::endl;
   std::cout << identity<HASH("11111111")>::value << std::endl;

   std::cout << identity<HASH("111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111")>::value << std::endl;

   std::cout << identity<HASH("1111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111")>::value << std::endl;

   std::cout << identity<HASH("11111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("1111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("11111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("1111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("11111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("1111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("11111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111111111111111111111111")>::value << std::endl;

   std::cout << identity<HASH("1111111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("11111111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("111111111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
   std::cout << identity<HASH("1111111111111111111111111111111111111111111111111111111111111111")>::value << std::endl;
}



Добавлено через 12 минут
Цитата(mes @  14.2.2011,  02:55 Найти цитируемый пост)
этот код работает ?

забыл сказать, результат - 720

Добавлено через 12 минут и 59 секунд
Цитата(mes @  14.2.2011,  02:55 Найти цитируемый пост)
тогда можно используя рекурсию шаблонов, создать хэш-итератор..

в смысле, чтоб избавиться от баяна чаров? вариант.
PM WWW   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0955 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.