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

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

Дано пятнишное ТЗ. На вход чёрного ящика идёт список строк (разделённый 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
28.11.2014, 15:43
    #38819734
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
mayton(разделённый ENTER-ами).Какой же он после этого потоковый?
...
Рейтинг: 0 / 0
28.11.2014, 16:03
    #38819778
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
Я нифига не понял. Библиотек умеющих считать MD5 мало?
...
Рейтинг: 0 / 0
28.11.2014, 21:22
    #38820027
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
В аттаче исходник, нашел как-то давным-давно в инете. Работает стабильно. Скорость не замерял.

Код: 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
28.11.2014, 23:53
    #38820117
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
У меня - тот-же самый. Сравниваю через WinMerge. 1:1.

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

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

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

Например, за выходные создать сильный ИИ :)
...
Рейтинг: 0 / 0
29.11.2014, 13:13
    #38820237
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
Над ИИ подумаю. Правда тема С++ не будет раскрыта.
...
Рейтинг: 0 / 0
29.11.2014, 18:23
    #38820338
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
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
29.11.2014, 19:11
    #38820351
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
Какой же он все-таки уродливый, этот ваш Rust
...
Рейтинг: 0 / 0
29.11.2014, 19:32
    #38820355
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
Mozok, +1

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

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

Ну да бох с ним.
Это наверно уже мои дописки. Плохо почистил :)
...
Рейтинг: 0 / 0
29.11.2014, 22:35
    #38820424
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
Неплохие дописки
...
Рейтинг: 0 / 0
30.11.2014, 00:03
    #38820491
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
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
30.11.2014, 05:59
    #38820526
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничное задание. Потоковый MD5
Mozok,

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

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

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

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


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