powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничное задание. Потоковый MD5
16 сообщений из 16, страница 1 из 1
Пятничное задание. Потоковый MD5
    #38819716
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здарова други!

Чо как? Как делы?

Дано пятнишное ТЗ. На вход чёрного ящика идёт список строк (разделённый ENTER-ами).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1
123
123456789
abc
abracadabra
masterZiv
mayton
qwerty



На выходе ящика надо получить список строк с MD5-хешами.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
c4ca4238a0b923820dcc509a6f75849b 1
202cb962ac59075b964b07152d234b70 123
25f9e794323b453885f5181f1b624d0b 123456789
900150983cd24fb0d6963f7d28e17f72 abc
ec5287c45f0e70ec22d52e8bcbeeb640 abracadabra
92a3c0d3be397e062a04cd02b10f0aa2 masterZiv
a731a0643dd9cf60bcf57fc00ff29c71 mayton
d8578edf8458ce06fbc5bb76a58c5ca4 qwerty



Кодьте ящик! Предлагайте идеи. Обратите внимание на (возможный) алфавитный порядок входных данных.
Жосткий хардкод на сях и на крестах, и местами с Ассемблером - приветсвтуется!

Для теста я использовал http://www.md5.cz/

P.S. Поздравляю всех с 5-дневной неделькой и желаю приятных выходных.

Ваш mayton.

И помните! Я тоже участвую в этом задании! Хехе.
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38819734
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton(разделённый ENTER-ами).Какой же он после этого потоковый?
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38819778
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нифига не понял. Библиотек умеющих считать MD5 мало?
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820027
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В аттаче исходник, нашел как-то давным-давно в инете. Работает стабильно. Скорость не замерял.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include "md5.h"

int main(int argc, char* argv[])
{
	char key[] = "mayton";
	char md5[33];
	md5_sum(key, md5, 32);
	md5[32] = 0;
	printf("%s %s\n", md5, key);
	return 0;
}



Результат:
Код: plaintext
1.
A731A0643DD9CF60BCF57FC00FF29C71 mayton
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - тот-же самый. Сравниваю через WinMerge. 1:1.

Хотя... стоп. Одна функция md5_sum у меня отсутствует. И RandMD5.

Ну да бох с ним.
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820201
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Задачки должны быть сложнее и интереснее, чем тривиальные лабы для первокурсников.

Например, за выходные создать сильный ИИ :)
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Над ИИ подумаю. Правда тема С++ не будет раскрыта.
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820338
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
специально для тебя:
Осторожно, хардкод!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
use std::io;
use std::slice::raw::buf_as_slice;
use std::iter;

fn process_data<R: Reader>(reader: &mut io::BufferedReader<R>) -> String {
    let mut result = io::MemWriter::new();
    for line in reader.lines() {
        let raw_text = line.unwrap();
        let mut text = Vec::new();
        text.push_all(raw_text.trim().as_bytes());

        let raw_msg_len: Option<u64> = FromPrimitive::from_uint(text.len() * 8);
        let msg_len = match raw_msg_len {
            Some(num) => num,
            None      => {
                assert!(false, "Unable to convert uint to u64");
                return String::new();
            }
        };

        text.push(128);
        let tail_len = text.len() % 64;
        text.grow(64 * (tail_len / 57) + 56 - tail_len, 0);
        let len_addr: *const u64 = &msg_len.to_le();
        let len_bytes = len_addr as *const u8;
        unsafe {
            buf_as_slice(len_bytes, std::mem::size_of::<u64>(), |s| {
                text.push_all(s);
            });
        }

        let mut digest: [u32, ..4] = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];
        let t: [u32, ..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];

        for chunk_start in iter::range_step(0, text.len(), 64) {
            let text_chunk = text.slice(chunk_start, chunk_start + 64);

            let x_ptr: *const u32 = text_chunk.as_ptr() as *const u32;
            unsafe {
                buf_as_slice(x_ptr, text_chunk.len() / 4, |x| {
                    let mut a = digest[0];
                    let mut b = digest[1];
                    let mut c = digest[2];
                    let mut d = digest[3];

                    let f = |b: u32, c: u32, d: u32| {(b & c) | (!b & d)};
                    let g = |b: u32, c: u32, d: u32| {(b & d) | (c & !d)};
                    let h = |b: u32, c: u32, d: u32| {b ^ c ^ d};
                    let i = |b: u32, c: u32, d: u32| {c ^ (b | !d)};

                    for j in iter::range_step_inclusive(0, 12, 4) {
                        a = b + (a + f(b, c, d) + x[j] + t[j]).rotate_left(7);
                        d = a + (d + f(a, b, c) + x[j + 1] + t[j + 1]).rotate_left(12);
                        c = d + (c + f(d, a, b) + x[j + 2] + t[j + 2]).rotate_left(17);
                        b = c + (b + f(c, d, a) + x[j + 3] + t[j + 3]).rotate_left(22);
                    }

                    for j in iter::range_step_inclusive(1, 13, 4) {
                        a = b + (a + g(b, c, d) + x[j] + t[j + 15]).rotate_left(5);
                        d = a + (d + g(a, b, c) + x[(j + 5) % 16] + t[j + 16]).rotate_left(9);
                        c = d + (c + g(d, a, b) + x[(j + 10) % 16] + t[j + 17]).rotate_left(14);
                        b = c + (b + g(c, d, a) + x[j - 1] + t[j + 18]).rotate_left(20);
                    }

                    for j in iter::range_step_inclusive(0, 12, 4) {
                        let offset = (5 - j) % 16;
                        a = b + (a + h(b, c, d) + x[offset] + t[j + 32]).rotate_left(4);
                        d = a + (d + h(a, b, c) + x[(offset + 3) % 16] + t[j + 33]).rotate_left(11);
                        c = d + (c + h(d, a, b) + x[(offset + 6) % 16] + t[j + 34]).rotate_left(16);
                        b = c + (b + h(c, d, a) + x[(offset + 9) % 16] + t[j + 35]).rotate_left(23);
                    }

                    for j in iter::range_step_inclusive(0, 12, 4) {
                        let offset = (16 - j) % 16;
                        a = b + (a + i(b, c, d) + x[offset] + t[j + 48]).rotate_left(6);
                        d = a + (d + i(a, b, c) + x[(offset + 7) % 16] + t[j + 49]).rotate_left(10);
                        c = d + (c + i(d, a, b) + x[(offset + 14) % 16] + t[j + 50]).rotate_left(15);
                        b = c + (b + i(c, d, a) + x[(offset + 21) % 16] + t[j + 51]).rotate_left(21);
                    }

                    digest[0] += a;
                    digest[1] += b;
                    digest[2] += c;
                    digest[3] += d;
                });
            }
        }
        
        let digest_addr = digest.as_ptr() as *const u8;
        unsafe {
            buf_as_slice(digest_addr, 4 * digest.len(), |digest_bytes| {
                for byte in digest_bytes.iter() {
                    (write!(result, "{:02x}", *byte)).ok().expect("Failed to write digest");
                }
            });
        }
        (write!(result, " {}", raw_text)).ok().expect("Failed to write original text");
    }
    String::from_utf8(result.unwrap()).unwrap()
}

...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820351
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой же он все-таки уродливый, этот ваш Rust
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820355
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok, +1

Спасибо за Rust. Это мегаофигенно.
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820414
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня - тот-же самый. Сравниваю через WinMerge. 1:1.

Хотя... стоп. Одна функция md5_sum у меня отсутствует. И RandMD5.

Ну да бох с ним.
Это наверно уже мои дописки. Плохо почистил :)
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820424
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохие дописки
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820491
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

то ли еще будет. Вот вам lazy итераторы с многопоточкой,
оцените "краткость и выразительность" объявления возращаемого типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
use std::io;
use std::iter;
use std::slice::raw::buf_as_slice;
use std::sync::Future;

fn process_data<R: Reader>(reader: &mut io::BufferedReader<R>) -> iter::Map<Future<Vec<u8>>, String, iter::Map<Result<String, io::IoError>, Future<Vec<u8>>, io::Lines<io::BufferedReader<R>>>> {
    reader.lines().map(|line| Future::spawn(proc() {
        let raw_text = line.unwrap();
        let mut text = Vec::new();
        text.push_all(raw_text.trim().as_bytes());

        let msg_len: u64 = FromPrimitive::from_uint(text.len() * 8).unwrap();
        text.push(128);
        let tail_len = text.len() % 64;
        text.grow(64 * (tail_len / 57) + 56 - tail_len, 0);
        
        let len_addr: *const u64 = &msg_len.to_le();
        let len_bytes = len_addr as *const u8;
        unsafe {
            buf_as_slice(len_bytes, std::mem::size_of::<u64>(), |s| {
                text.push_all(s);
            });
        }

        let mut digest: [u32, ..4] = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];
        let t: [u32, ..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];

        for chunk_start in iter::range_step(0, text.len(), 64) {
            let text_chunk = text.slice(chunk_start, chunk_start + 64);

            let x_ptr: *const u32 = text_chunk.as_ptr() as *const u32;
            unsafe {
                buf_as_slice(x_ptr, text_chunk.len() / 4, |x| {
                    let mut a = digest[0];
                    let mut b = digest[1];
                    let mut c = digest[2];
                    let mut d = digest[3];

                    let f = |b: u32, c: u32, d: u32| {(b & c) | (!b & d)};
                    let g = |b: u32, c: u32, d: u32| {(b & d) | (c & !d)};
                    let h = |b: u32, c: u32, d: u32| {b ^ c ^ d};
                    let i = |b: u32, c: u32, d: u32| {c ^ (b | !d)};

                    for j in iter::range_step_inclusive(0, 12, 4) {
                        a = b + (a + f(b, c, d) + x[j] + t[j]).rotate_left(7);
                        d = a + (d + f(a, b, c) + x[j + 1] + t[j + 1]).rotate_left(12);
                        c = d + (c + f(d, a, b) + x[j + 2] + t[j + 2]).rotate_left(17);
                        b = c + (b + f(c, d, a) + x[j + 3] + t[j + 3]).rotate_left(22);
                    }

                    for j in iter::range_step_inclusive(1, 13, 4) {
                        a = b + (a + g(b, c, d) + x[j] + t[j + 15]).rotate_left(5);
                        d = a + (d + g(a, b, c) + x[(j + 5) % 16] + t[j + 16]).rotate_left(9);
                        c = d + (c + g(d, a, b) + x[(j + 10) % 16] + t[j + 17]).rotate_left(14);
                        b = c + (b + g(c, d, a) + x[j - 1] + t[j + 18]).rotate_left(20);
                    }

                    for j in iter::range_step_inclusive(0, 12, 4) {
                        let offset = (5 - j) % 16;
                        a = b + (a + h(b, c, d) + x[offset] + t[j + 32]).rotate_left(4);
                        d = a + (d + h(a, b, c) + x[(offset + 3) % 16] + t[j + 33]).rotate_left(11);
                        c = d + (c + h(d, a, b) + x[(offset + 6) % 16] + t[j + 34]).rotate_left(16);
                        b = c + (b + h(c, d, a) + x[(offset + 9) % 16] + t[j + 35]).rotate_left(23);
                    }

                    for j in iter::range_step_inclusive(0, 12, 4) {
                        let offset = (16 - j) % 16;
                        a = b + (a + i(b, c, d) + x[offset] + t[j + 48]).rotate_left(6);
                        d = a + (d + i(a, b, c) + x[(offset + 7) % 16] + t[j + 49]).rotate_left(10);
                        c = d + (c + i(d, a, b) + x[(offset + 14) % 16] + t[j + 50]).rotate_left(15);
                        b = c + (b + i(c, d, a) + x[(offset + 21) % 16] + t[j + 51]).rotate_left(21);
                    }

                    digest[0] += a;
                    digest[1] += b;
                    digest[2] += c;
                    digest[3] += d;
                });
            }
        }
        
        let mut result = io::MemWriter::new();
        let digest_addr = digest.as_ptr() as *const u8;
        unsafe {
            buf_as_slice(digest_addr, 4 * digest.len(), |digest_bytes| {
                for &byte in digest_bytes.iter() {
                    (write!(result, "{:02x}", byte)).unwrap();
                }
            });
        }
        (write!(result, " {}", raw_text.trim())).unwrap();
        result.unwrap()
    })).map(|mut future_hash| String::from_utf8(future_hash.get()).unwrap())
}

...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820526
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok,

а чего unsafe-то? ничего опасного в коде вроде бы.

Mozokоцените "краткость и выразительность" объявления возращаемого типа
это, имхо, из-за попытки заюзать как можно больше фич языка одновременно.
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820656
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfа чего unsafe-то? ничего опасного в коде вроде бы.

buf_as_slice - это, по сути, reinterpret_cast. Rust в таких случаях не может гарантировать
целостность памяти и вынуждает программиста явно отмечать место возможного SEGFAULT.
RWolfэто, имхо, из-за попытки заюзать как можно больше фич языка одновременно.
Это я еще lifetime не указал явно . А вообще, на шарповый yield return уже есть RFC .
...
Рейтинг: 0 / 0
Пятничное задание. Потоковый MD5
    #38820690
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку тема С++ неярко выражена ставлю вопрос о переносе в Программирование.
Если никто не возражает то через сутки будет сделано.

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничное задание. Потоковый MD5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]