Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2014, 11:09   #1
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию есть код который генерирует md5. Но не пойму как его вызывать

Привет, я вообще не шарю С/C++
Мне нужно встроить эту функцию в Python. Говорят что он в 20 раз быстрее выполнится.

Но я вообще не понимаю как вызвать ее.
Функцию скачал с WIKI.
Подскажите пожалуйста!

Код:
/*
 * Simple MD5 implementation
 *
 * Compile with: gcc -o md5 -O3 -lm md5.c
 *
 * NOTE: this code only works on little-endian machines.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

// Constants are the integer part of the sines of integers (in radians) * 2^32.
const uint32_t k[64] = {
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee ,
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501 ,
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be ,
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821 ,
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa ,
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8 ,
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed ,
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a ,
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c ,
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70 ,
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05 ,
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665 ,
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039 ,
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1 ,
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1 ,
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };

// leftrotate function definition
#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))

// These vars will contain the hash
uint32_t h0, h1, h2, h3;

void md5(uint8_t *initial_msg, size_t initial_len) {

    // Message (to prepare)
    uint8_t *msg = NULL;
    int new_len;
    uint32_t bits_len;
    int offset;
    uint32_t *w;
    uint32_t a, b, c, d, i, f, g, temp;

    // Note: All variables are unsigned 32 bit and wrap modulo 2^32 when calculating

    // r specifies the per-round shift amounts
    const uint32_t r[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
                          5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20,
                          4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
                          6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21};

    // Initialize variables - simple count in nibbles:
    h0 = 0x67452301;
    h1 = 0xefcdab89;
    h2 = 0x98badcfe;
    h3 = 0x10325476;

    // Pre-processing: adding a single 1 bit
    //append "1" bit to message    
    /* Notice: the input bytes are considered as bits strings,
       where the first bit is the most significant bit of the byte.[37] */

    // Pre-processing: padding with zeros
    //append "0" bit until message length in bit ≡ 448 (mod 512)
    //append length mod (2 pow 64) to message

    for(new_len = initial_len*8 + 1; new_len%512!=448; new_len++);
    new_len /= 8;

    msg = (uint8_t*)calloc(new_len + 64, 1); // also appends "0" bits 
                                   // (we alloc also 64 extra bytes...)
    memcpy(msg, initial_msg, initial_len);
    msg[initial_len] = 128; // write the "1" bit

    bits_len = 8*initial_len; // note, we append the len
    memcpy(msg + new_len, &bits_len, 4);           // in bits at the end of the buffer

    // Process the message in successive 512-bit chunks:
    //for each 512-bit chunk of message:
    for(offset=0; offset<new_len; offset += (512/8)) {

        // break chunk into sixteen 32-bit words w[j], 0 ≤ j ≤ 15
        w = (uint32_t *) (msg + offset);

#ifdef DEBUG
        printf("offset: %d %x\n", offset, offset);

        int j;
        for(j =0; j < 64; j++) printf("%x ", ((uint8_t *) w)[j]);
        puts("");
#endif
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось Stilet; 16.08.2014 в 16:00.
pompiduskus вне форума Ответить с цитированием
Старый 16.08.2014, 11:09   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Весь код не влез.

это продолжение

Код:

        // Initialize hash value for this chunk:
        a = h0;
        b = h1;
        c = h2;
        d = h3;

        // Main loop:
        for(i = 0; i<64; i++) {

             if (i < 16) {
                f = (b & c) | ((~b) & d);
                g = i;
            } else if (i < 32) {
                f = (d & b) | ((~d) & c);
                g = (5*i + 1) % 16;
            } else if (i < 48) {
                f = b ^ c ^ d;
                g = (3*i + 5) % 16;          
            } else {
                f = c ^ (b | (~d));
                g = (7*i) % 16;
            }

             temp = d;
            d = c;
            c = b;
            b = b + LEFTROTATE((a + f + k[i] + w[g]), r[i]);
            a = temp;

        }

        // Add this chunk's hash to result so far:
        h0 += a;
        h1 += b;
        h2 += c;
        h3 += d;

    }

    // cleanup
    free(msg);

}

int main(int argc, char **argv) {

    if (argc < 2) {
        printf("usage: %s 'string'\n", argv[0]);
        return 1;
    }

    char *msg = argv[1];
    size_t len = strlen(msg);

    // benchmark
    int i;
    for (i = 0; i < 1000000; i++) {
        md5((uint8_t*)msg, len);
    }

    //var char digest[16] := h0 append h1 append h2 append h3 //(Output is in little-endian)
    uint8_t *p;

    // display result

    p=(uint8_t *)&h0;
    printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h0);

    p=(uint8_t *)&h1;
    printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h1);

    p=(uint8_t *)&h2;
    printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h2);

    p=(uint8_t *)&h3;
    printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h3);
    puts("");

    return 0;
}
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 16.08.2014, 11:19   #3
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Мне для теста скорости это нужно. Попробовал на простом цикле for. разница прост огромная.
На Python 1.000.000.000 инераций выполняется 138 секудну, на C всего 6 секунд.

В 23 раза быстрее
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 16.08.2014, 12:17   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Вопрос то в чем?

Цитата:
Мне для теста скорости это нужно. Попробовал на простом цикле for. разница прост огромная.
На Python 1.000.000.000 инераций выполняется 138 секудну, на C всего 6 секунд.
Такие тесты ниочем не говорят. Никогда. Приведи сюда код который ты тестировал.

Я не пишу на питоне, но не верю что хэш на нем вычисляется в 20 раз дольше.
Уже аргументированно не верю. На вот: http://fossies.org/dox/Python-3.4.1/...py_source.html

Это исходники модуля hashlib питона.

Первая цитата о производительности:
Цитата:
Named constructor functions are also available, these are faster than using new(name):
И еще там почитай, т.е. если у тебя что-то медленно работает, то радиус кривизны рук большой, а не питон плохой.

Тем кто говорит что что-то там в 20 раз быстрее выполнится - передай что они дебилы, а разработчики питона - умные.
Цитата:
Код:
f()
104  # Use the C function directly (very fast)
Там и так используются модули написанные на Си. От того что ты соберешь руками DLL и начнешь ее исопльзовать эффективность тока упадет, т.к. разработчики питона судя по коментам занимались повышением эффективности:
Цитата:
Код:
# Fast inline HMAC implementation
164  inner = new(hash_name)
165  outer = new(hash_name)
166  blocksize = getattr(inner, 'block_size', 64)
Почитай коменты, МБ узнаешь как эффективнее это исопльзовать.

От того что ты присобачишь сбоку руками собранную библиотеку ты потеряешь и в производительности (скорее всего), т.к. не сделаешь все также круто как они, и в надежности (100%) и в кроссплатформенности.

Не занимайся ерундой.

Последний раз редактировалось Stilet; 16.08.2014 в 16:01.
rrrFer вне форума Ответить с цитированием
Старый 16.08.2014, 13:24   #5
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Вообщем, в питон поддерживает всего 6 методов хеширования. Я подключил чужую либу. Но она в 2,5 раза медленее рабоает.

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

Как мне вызвать функцию в коде выше ? какие параметры нужно передать ? помоги если сам знаешь конечно! А кидать ссыль мне на мануалы по питону не стоит. Я из них и так не вылажу =)

приведу пример,

Перемножение матрици 3000*3000 с произвольными числами на питоне длится

8.70 sec
а тот же самый код на С но импортирован в питон, и вызывается как часть питона
0.43 sec

итого в 19 раз быстрее.
Если интересно, я прямо на этот момент поставил, посмотри там букваль пару минут "часть из лекции"

https://www.youtube.com/watch?v=kRlq9Ifjs-E&t=667

Ребята подскажите как мне вызвать функцию и кода выше ?
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 16.08.2014 в 13:27.
pompiduskus вне форума Ответить с цитированием
Старый 16.08.2014, 14:14   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

гугл - python c++ - первая ссылка офф дока

чего вам не хватает?
p51x на форуме Ответить с цитированием
Старый 16.08.2014, 14:21   #7
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Вы что сговорились ? Как мне вызвать вот эту функцию ? Или вы сами не знаете ?

Пробовал вот так

Код:
md5('aaa', 32), и так md5(32. 'aaa')
Ничего не работает.
Вам что жалко что ли. Что за люди. Писать пост на 300 строк и ссылки искать не лень ? а как функцию вызвать сказать не могут.

Как в С/C++ эту функцию вызвать, какие аргументы нужно передавать. Как работает питон я и сам знаю.

Точно как в той хохме.

"Идеи турист по Одессе. Спрашивает турист у мимо проходящего прохожего. (Еврея)"
Скажите а как пройти на деребасовскую. Мужик - Ой, зачем вам это нужно, сходите лучше на кладбище к маей маме!

А вы случайно не из этих =)
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось Stilet; 16.08.2014 в 16:01.
pompiduskus вне форума Ответить с цитированием
Старый 16.08.2014, 14:50   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

pompiduskus
Чувак, научись читать. Я тебе написал - собери DLL и подключи ее к питону. Я тебе скинул не ссылку на мануал, а ссылку на исходник питона. Там показано как подключать библиотеку.

Цитата:
приведу пример,

Перемножение матрици 3000*3000 с произвольными числами на питоне длится

8.70 sec
а тот же самый код на С но импортирован в питон, и вызывается как часть питона
0.43 sec

итого в 19 раз быстрее.
По ушам ездить не надо, приведи код. И учись читать, я в сообщении #4 уже говорил:
>> Такие тесты ниочем не говорят. Никогда. Приведи сюда код который ты тестировал.

Просто так код не импортируется в питон, импортируется библиотека, которую ты должен собрать. То, как это делается зависит от операционной системы и компилятора тоже. Мы не знаем чем ты там пользуешься. На вот ссылку на msdn, там описано для windows и компилятора микрософта (которым я не пользуюсь ваще, например, но знаю что по библиотекам у них там свои заморочки есть).
http://msdn.microsoft.com/ru-ru/library/ms235636.aspx

Иди учись читать короче.

Цитата:
Ничего не работает.
Вам что жалко что ли. Что за люди. Писать пост на 300 строк и ссылки искать не лень ? а как функцию вызвать сказать не могут.

Как в С/C++ эту функцию вызвать, какие аргументы нужно передавать. Как работает питон я и сам знаю.
Ну если ты все знаешь и проблема только в этом - то вызывать так:
md5("hello world", 11);
Тут 11 - длина строки.

Только вопрос тогда надо было формулировать так: "вот код <код>, подскажите как вызвать функцию (какие аргументы передать)." А не писать нам тут про питон и про то что цикл в С++ работает в тыщу раз быстрее. Умный компилятор в С++ просто считать твой цикл ваще не стал, т.к. догадался что эти вычисления на*хер не нужны.

Как форумный психиатр, прописываю тебе ведерную клизму за плохо заданный вопрос.

Последний раз редактировалось Stilet; 16.08.2014 в 16:01.
rrrFer вне форума Ответить с цитированием
Старый 16.08.2014, 16:00   #9
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Ну если ты все знаешь и проблема только в этом - то вызывать так:
md5("hello world", 11);
Тут 11 - длина строки.

Как форумный психиатр, прописываю тебе ведерную клизму за плохо заданный вопрос.
Да, я не правильно выразился наверное.

Спасибо доктор

===============================
А на счет того что код на С выполняетс япримерно в 20 раз быстрее чистого ПИтона. Это не я придумал. Я же дал ссылку. Перемножение Гиганской матрици 3000*3000.

Вообще при иного боагодарен. =)
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 16.08.2014 в 16:04.
pompiduskus вне форума Ответить с цитированием
Старый 16.08.2014, 17:06   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
А на счет того что код на С выполняетс япримерно в 20 раз быстрее чистого ПИтона. Это не я придумал. Я же дал ссылку. Перемножение Гиганской матрици 3000*3000.
Ну ссылку ко ты на видос дал, я ждал ссылку на объективную статью.

По твоей ссылке какая-то девочка неразумная. Она вообще говорить не умеет, заикается.

Цитата:
Для того чтобы сравнить, да. Для того чтобы посмотреть а правда ли это было оправдано. Вот это вот все. эээ... достаточно странное действие написать свою библиотеку на языке С++ потом ее скомпилировать, слинковать (машет руками) и....ии эээ.... заиспользовать ааа... можно посмотреть на время работы...
Это то, с чего твоя девочка начинает (запятые я расставить не все смог, т.к. правилам русского языка потоки сознания не подчиняются). Как по мне, у нее речь вообще несвязная. Ее предварительный диагноз - "нелогичность".
Цитата:
Один из видов невладения речью, в частности, монологической (устной и письменной). Следствие недостаточной образованности или недостаточной логичности как качества ума. Сильно затрудняет восприятие мыслей, их хода. См. нелогичность.
Я не стал смотреть видос до конца, но кода я не увидел. Девочка показала как она вызывает функцию do(). Она не привела ни реализацию на питоне, ни на С++, просто вызов функции do(). Я предсказываю, что она тот еще говнокодер (судя по диагнозу, который ей поставил наш психиатр)

Последний раз редактировалось rrrFer; 16.08.2014 в 17:10.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли в delphi md5 как в lazaruse, там достаточно подключить MD5 и считать хэш? Taner Общие вопросы Delphi 8 12.05.2014 08:38
код, который должен открывать файл, находить в нем определенный символ и заменять его на другой, не записывает в файл Dima-War Общие вопросы C/C++ 2 14.12.2013 21:35
сохранить текстовый файл, который загружен в мемо поле (загрузка файла- есть код) Делфи 7 программирование Помощь студентам 5 22.11.2013 07:17
Повторение javascript кода бесконечно! Есть код,хочу заставить его повторяться Viboxjuwin JavaScript, Ajax 5 11.10.2013 13:46
Возможна ли программа на Delphi, которая генерирует текст и постит его на сайт vindows93 Свободное общение 31 16.12.2011 22:33