Могу ли я передать параметр в функцию сортировки std :: vector?

Это bcrypt:

Создайте случайную соль. Фактор «стоимость» был предварительно настроен. Соберите пароль.

Выведите ключ шифрования из пароля с использованием коэффициента соли и стоимости. Используйте его для шифрования известной строки. Сохраните стоимость, соль , и шифрованный текст. Поскольку эти три элемента имеют известную длину, их легко конкатенировать и хранить в одном поле, но они могут разделить их позже.

Когда кто-то пытается аутентифицироваться, извлекайте сохраненную стоимость и соль , Выведите ключ из пароля ввода, стоимости и соли. Зашифруйте одну и ту же хорошо известную строку. Если сгенерированный текст шифрования соответствует сохраненному шифруемому тексту, пароль соответствует.

Bcrypt работает очень похоже на более традиционные схемы на основе алгоритмов, таких как PBKDF2. Основное различие заключается в использовании производного ключа для шифрования известного простого текста; другие схемы (разумно) предполагают, что функция деривации ключа необратима и непосредственно сохраняет производный ключ.


Сохраненный в базе данных хэш-файл bcrypt может выглядеть примерно так:

$ 2a $ 10 $ vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

blockquote>

Это фактически три поля, разделенные символом «$»:

  • 2a идентифицирует версию алгоритма bcrypt, которая была использована.
  • 10 - коэффициент затрат; 210 используются итерации функции деривации ключа (этого, кстати, недостаточно. Я бы рекомендовал стоимость 12 или более.)
  • vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa - это соль и шифрованный текст, объединенный и кодируется в модифицированном Base-64. Первые 22 символа декодируют до 16-байтового значения для соли. Остальные символы - это шифрованный текст, который нужно сравнить для аутентификации.

Этот пример взята из документации для реализации Ruby Coda Hale.

13
задан Paulo Rodrigues Pinto 29 January 2010 в 01:35
поделиться

5 ответов

class sorter {
      short type_;
public:
      sorter(short type) : type_(type) {}
      bool operator()(MyClass const* o1, MyClass const* o2) const {
            return SortFunction(o1, o2, type_ );
      }
};

std::sort(Vec.begin(), Vec.end(), sorter(MY_TYPE) );
21
ответ дан 1 December 2019 в 19:40
поделиться

Использование Boost.lambda и без какой-либо специальной функции сортировки , прямо в вашем коде, где вам нужна сортировка:

Кратко

// sort with VARA_ID
sort(Vec.begin(), Vec.end(), bind(&MyClass::varA, _1)<bind(&MyClass::varA, _2));

// sort with VARB_ID
sort(Vec.begin(), Vec.end(), bind(&MyClass::varB, _1)<bind(&MyClass::varB, _2));

полный пример

#include <iostream>
#include <vector>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>

using namespace boost::lambda;

class MyClass {
public:
    int varA;
    int varB;
};

enum SorterType {
    VARA_ID,
    VARB_ID 
};

int main()
{

    std::vector<MyClass*> Vec;

    Vec.push_back(new MyClass());
    Vec.push_back(new MyClass());
    Vec.push_back(new MyClass());

    Vec[0]->varA = 1; Vec[0]->varB = 8;
    Vec[1]->varA = 2; Vec[1]->varB = 7;
    Vec[2]->varA = 3; Vec[2]->varB = 6;

    // sort with VARA_ID
    std::sort(Vec.begin(), Vec.end(), 
              bind(&MyClass::varA, _1)  < bind(&MyClass::varA, _2) );

    // VARB_ID
    std::sort(Vec.begin(), Vec.end(), 
              bind(&MyClass::varB, _1)  < bind(&MyClass::varB, _2) );

    return 0;
}
3
ответ дан 1 December 2019 в 19:40
поделиться

. Значение тип меняется с каждым сравнением? Это не может, как кажется. В этом случае используйте карриную функцию - см. Boost :: Bind .

std::sort(v.begin(), v.end(), boost::bind(SortFunction, _1, _2, type));
2
ответ дан 1 December 2019 в 19:40
поделиться

Более общим решением также могло бы быть использование указателей на члены:

#include <vector>
#include <algorithm>
#include <functional>

struct MyClass {
    int varA;
    int varB;
};

template <class Object, class VarType>
class CompareMemberT: public std::binary_function<bool, const Object*, const Object*>
{
    VarType Object::*p;
public:
    CompareMemberT(VarType Object::*p): p(p) {}
    bool operator()(const Object* a, const Object* b) const
    {
        return a->*p < b->*p;
    }
};

//helper to deduce template arguments
template <class Object, class VarType>
CompareMemberT<Object, VarType> CompareMember(VarType Object::*p)
{
    return CompareMemberT<Object, VarType>(p);
}

int main()
{
    std::vector<MyClass*> vec;
    std::sort(vec.begin(), vec.end(), CompareMember(&MyClass::varA));
    std::sort(vec.begin(), vec.end(), CompareMember(&MyClass::varB));
}
2
ответ дан 1 December 2019 в 19:40
поделиться

Вы почти на месте, сделайте тип параметром шаблона и сигнатура будет OK:

template<int type>
bool SortFunction(const MyClass* obj1, const MyClass* obj2) {
     if( type == VARA_ID )
         return obj1->varA < obj2->varA;
     else // if( type == VARB_ID ) -- A sort function must have a default.
         return obj1->varB < obj2->varB;
}

std::sort(Vec.begin(), Vec.end(), &SortFunction<VARA_ID> );

Оптимизатор заметит, что ( тип == VARA_ID ) является константой времени компиляции.

6
ответ дан 1 December 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: