Заголовок сообщения: Кто силён в хешировании, подскажите.
Добавлено: Пт фев 13, 2009 12:28:31
Грызет канифоль
Зарегистрирован: Вт апр 29, 2008 14:19:10 Сообщений: 251 Откуда: Великий Новгород (не путать с Нижним)
Рейтинг сообщения:0
Имеется канал передачи данных на станок ЧПУ. В данный момент реализован только контроль чётности побайтно. Нужен какой-нибудь алгоритм подсчёта контрольной суммы всего файла. Желательно, чтобы легко реализовывался аппаратно на приёме.
Если, допустим, просто и без затей, применить 256-битный XOR, как можно грубо прикинуть вероятность коллизий? Длина файлов от ~1кБ до `65кБ.
Зарегистрирован: Вт апр 29, 2008 14:19:10 Сообщений: 251 Откуда: Великий Новгород (не путать с Нижним)
Рейтинг сообщения:0
Станок нормальный, серийный СМ-600 (сверлильно-фрейзерный). Но канал связи - самопал. Плата сопряжения с фотосчиткой заменена на самопальную плату, принимающую данные по 1 верёвке. Вот на этой-то плате есть возможность прилепить примочку для подсчёта КС.
Проблема - как лучше сгенерить эту КС на передающем конце. По какому алгоритму. Чтобы как можно прооще было аппаратно восстановить её в приёмнике. И в то же время, чтобы по-надёжнее, в плане коллизий.
Можно как в интернет сети - контрольная сумма (сумма всех с учётом переноса-переполнения) и в конце пакета добовляем ..
На приёме опять таки тотже алгоритм - суммы. и теперь он уже для всего пакета с добавкои даст, не знаю как сказать - максимум... (255 ... 65535 , FF .. FFFF в зависимости сколькобитная контрольная сумма)
Т.е. пример десяцтичной контрольной суммы:
пакет: 1, 2, 3, 7, 6, 4
сумма: 23 - т.е. 2 было это переносы в десятки , тоесть сумма с учетом переноса будет: 2 + 3 = 5
дополнение будет - до максимума десятичнои системы: т.е. 9 - 5 = 4
передаём пакет : 1, 2, 3, 7, 6, 4, 4
на приёме сумма: 27
сумма с учетом переносов: 2 + 7 = 9
Приблезительно так только для нужной битности..
Для быстроты подсчетов : есть два варианта для учёта переноса:
- в начале находим общую сумму ( битность суммы больсхе данных ) и потом старший порядок сумируем с младшим.
- считаем сумму (размерность суммы и данных равны), и во время подсчета когда случается переполнение - добавляем к сумме 1 Для нахождения дополнения пакета тоже 2 варианта:
- "максимум - сумма"
- "инверсия суммы" = "побитовое не суммы" или "исключаюшее или от суммы по максимому"
Вообщем это уже дело програмирования и архитектуры..
Зарегистрирован: Вт апр 29, 2008 14:19:10 Сообщений: 251 Откуда: Великий Новгород (не путать с Нижним)
Рейтинг сообщения:0
А всё-таки, что будет, если просто проксорить? Дело в том, что морозить что-то серьёзное на стороне станка не представляется возможным. Надо какое-то совсем простое решение. Если, допустим, я сложу все передаваемые байты в 256-битную переменную, без учёта переноса (ну, или с учётом) и то же самое проделаю с помощью простой логики на приёме? Будет какой-нибудь эффект в плане надёжности передачи? Какая будет вероятность случайного совпадения КС?
Карма: 16
Рейтинг сообщений: 14
Зарегистрирован: Вс июн 01, 2008 00:17:35 Сообщений: 4673 Откуда: Я всего лишь плод вашего воображения...
Рейтинг сообщения:0 Медали: 1
Обождите, штабскапитан!
Вам что нужно - обеспечить надежность передачи? Если да, то тут надо именно так вопрос ставить - чего бы мне такое сделать, чтобы было без ошибок.
Если мне не изменяет память, то в 155-й серии были микрухи для работы с кодом, защищенным по методу Хемминга. Они обеспечивают гарантированное обнаружение двойных и устранение одиночных ошибок. Разумеется код Хемминга позволяет повысить защищенность еще выше, но вроде в тех ИМС именно такая (считающаяся стандартной) схема.
Если мне не изменяет память, то в 155-й серии были микрухи для работы с кодом, защищенным по методу Хемминга. Они обеспечивают гарантированное обнаружение двойных и устранение одиночных ошибок. Разумеется код Хемминга позволяет повысить защищенность еще выше, но вроде в тех ИМС именно такая (считающаяся стандартной) схема.
В 155 серии не было вроде, скорей в 555 серии проверка на четность.
А в буржуинских сериях полно:
74ALS280-9рзрядная схема проверки четности
74AS286-9рзрядная схема проверки четности
74F418-32разрядная схема обнаружения и исправления ошибок
74F420-32разрядная схема обнаружения и исправления ошибок
74ALS616-16разрядная схема обнаружения и исправления ошибок
74ALS617-16разрядная схема обнаружения и исправления ошибок
74LS630-16разрядная схема обнаружения и исправления ошибок
74LS631-16разрядная схема обнаружения и исправления ошибок
74ALS632-32разрядная схема обнаружения и исправления ошибок
74ALS633-32разрядная схема обнаружения и исправления ошибок
74ALS634-32разрядная схема обнаружения и исправления ошибок
74ALS635-32разрядная схема обнаружения и исправления ошибок
74LS636-8разрядная схема обнаружения и исправления ошибок
74LS637-8разрядная схема обнаружения и исправления ошибок
Привел такой длинный список потому, что наверное достать такой раритет возможно будет с огромным трудом.
Зарегистрирован: Вт апр 29, 2008 14:19:10 Сообщений: 251 Откуда: Великий Новгород (не путать с Нижним)
Рейтинг сообщения:0
Благодарю всех за ответы.
На счёт Хемминга - пожалуй, что нет, не подойдёт. На стороне станка стоит протой регистр стдвига, который копит 1 байт и передаёт его станку (старший бит - чётность). Если я правильно понимаю тему - код Хемминга требует пакетной передачи. Если ошибаюсь - пожалуйста, поправьте. А вот что такое 32-разрядная схема обраружения и исправления - это, если можно, пожалуйста разъясните. Или это имеется в виду всё тот же код Хемминга?
Короче так. Излагаю проблему ещё раз, чтобы вы могли сделать вывод - что мне подходит, а что нет. Ибо самому мне это не под силу. Что такое коды Хемминта, Грея и т. п. - для меня это очень далёкий звон.
И так: имеется программа под ДОСом, которая нестандартным способом по самопальному протоколу (если вобще применимо это слово) передаёт файлы в станок. Исходников никаких не сохранилось. В этой программе по мере своих сил ковыряюсь с помощью IDA Pro. Раньше она, вообще, работала через ISAшный порт. Мне удалось перенаправить её через COM (на новом компе нет шины ISA). В екзешнике есть место, куда можно засунуть свою процедуру, около 8 кБ. Туда возможен простой Call (тот же сегмент) из процедуры, выводящей в порт. То есть, теоретически, при достаточной математической подкованности, можно свормировать там иходный код, к примеру Хемминга. Допустим, даже мне удалось это сделать. Что далее? Ка принять этот код? Вышеупомнутая 32 разрядная схема обнаружения и исправления его примет и проанализирует? Она должна накопить 32 бита и затем их выдать? (Поправляйте, если неправ). Во-первых, в каком виде она их выдаст - в хемминговом? Мне-то нужет простой байт - 7 бит данных и 1 бит чётность. Во-вторых, приняв 32 бита она должна же и выдать сразу 32? А мне надо 8. То есть передал 8 бит - принял 8 бит. И т. д.
Вот, вкратце, каковы мои сомнения. Если я что-то не так понял, прошу меня поправить.
Аппаратно, проще всего поставить прооостинький микроконтроллер со встроенным USART, который будет принимать несколько байт считать по любому алгоритму контрольную сумму и выдавать тебе в станок парралельный код и строб. Нужно всего 2 микросхемы - микроконтроллер (например atmega32 хотя для твоей задачи она избыточна) и преобразователь уровней RS232<->TTL (например max232).
Если не хочешь связываться с написанием примитивнейшей прошивки для микроконтроллера, можешь сделать свой собственный корректирующий преобразователь:
парралельный код с твоего регистра подаешь на адресную линию ПЗУшки, а с её шины данных снимешь скорректированный код.
В ПЗУшку зашиваешь таблицу корректировки, хочешь Хеминга, хочешь кого другого....
Зарегистрирован: Вт апр 29, 2008 14:19:10 Сообщений: 251 Откуда: Великий Новгород (не путать с Нижним)
Рейтинг сообщения:0
Вот это, пожалуй, хорошая мысель - Дешифратор на ПЗУхе.
Теперь задача намба ван - как программно реализовать на передающей стороне.
Вторая задача - таблица дешифровки этого Хемминга.
Аналогичная конструкция возможна для 8 битных данных.
Тогда будет достаточно 7 бит избыточности
формировать можно массивом размерностью 256 байт,
1 байт на входе как адрес, из ячейки массива берёшь байта и отправляешь в СОМ-порт 2 байта, оригинальный и добытый из массива. На приеме имеешь 16 битное слово которое подаешь на адресную шину ПЗУхи.
Карма: 16
Рейтинг сообщений: 14
Зарегистрирован: Вс июн 01, 2008 00:17:35 Сообщений: 4673 Откуда: Я всего лишь плод вашего воображения...
Рейтинг сообщения:0 Медали: 1
Цитата:
Если я правильно понимаю тему - код Хемминга требует пакетной передачи. Если ошибаюсь - пожалуйста, поправьте. А вот что такое 32-разрядная схема обраружения и исправления - это, если можно, пожалуйста разъясните. Или это имеется в виду всё тот же код Хемминга?
В схемах обнаружения и исправления обычно Хемминг и используется. Вы даташит на любую микру скачайте и поглядите. Мы ж тоже не можем догадаться, что вам подойдет. Думаю, что подойдет. По большому счету вам надо одну такую микру. Она стоит на приеме у станка и берет у шифта принятый байт (этот момент должен кто-то квитировать, вообще кто-то очень примитивный должен генерить управляющие сигналы для микры Хемминга, там идет чтение и захват инфы и допкода для проверки, генерация допкода Хемминга, исправление). Затем она байт проверяет, корректирует, и отдает станку. На стороне компа код Хемминга генерите вы сам. Код Хемминга не запрещает использовать одновременно и четность внутри байта. Возможно даже можно будет что-то упростить.
Еще будут нужны двунаправленные порты-буфера, типа 244-го.
Цитата:
Она должна накопить 32 бита и затем их выдать? (Поправляйте, если неправ). Во-первых, в каком виде она их выдаст - в хемминговом? Мне-то нужет простой байт - 7 бит данных и 1 бит чётность. Во-вторых, приняв 32 бита она должна же и выдать сразу 32? А мне надо 8. То есть передал 8 бит - принял 8 бит. И т. д.
Она ничего не копит. Она получает параллельные байты (так у 16-разр, по 32-разр сказать не могу), и с ними делает что-то, что захотите. Если вы используете 16-разр микру, то на ее младший байт данных надо подать байт с информационного шифта, а на старший нолики прямо у микры. А еще надо поставить шифт, с которого инфа пойдет на контрольное слово и управление. Тогда вы пихаете в линию не 8 бит, а 16 бит, причем первые 8 бит - инфа, а вторые - контролька. Вторые 8 бит генерите в проге на компе. Таким образом, после нескольких операций засылки (может и проще обойдется) вы получаете проверенный байт на выходе.
Зарегистрирован: Вт апр 29, 2008 14:19:10 Сообщений: 251 Откуда: Великий Новгород (не путать с Нижним)
Рейтинг сообщения:0
Прикинул кое-что к носу и решил всё-таки ПОКА не заморачиваться с Хеммингом. Нет в данный момент времени 1 - изучать эту математику, 2 - искать и заказывать вышеупомянутые схемы обнаружения ошибок. Решил делать на том, что имеется под руками и то, что проще. Возможно, что это будет временный вариант. Просто сейчас уже надо дать станку работать, а тем временем можно будет параллельно заниматься всё-таки Хеммингом. Если рабоче-крестьянский вариант будет работать удовлетворительно, возможно он и останется. Но всеми советами, непременно воспользуюсь в будущем. Очень много полезной информации. Душевно всех благодарю.
А текущий вариант такой: 2 контрольные суммы - XOR и ADD. Это подсказал один человек, у которого это применено на практике.
Ещё была мысель просто-напросто дублировать каждый байт и браковать передачу при первом же несравнении. По скольку передача занимает всего несколько секунд, а перезагружать станок надо не чаще двух-трёх раз в смену, то это было бы вполне приемлемо. К тому же, контроль в этом случае почти абсолютный. Пока ещё не решил, на каком из двух вариантов остановться.
Ещё раз повторюсь - дело в дефиците времени. Нет возможности долго держать всё у себя - станок должен уже работать. О результатах обязательно отпишусь.
Огромное всем спасибо за ответы. Почерпнул мого полезного. Возможно вернусь позже к предложенным вами вариантам.
Последний раз редактировалось Штабскапитан Овечкин Чт фев 26, 2009 10:15:04, всего редактировалось 1 раз.
Карма: 16
Рейтинг сообщений: 14
Зарегистрирован: Вс июн 01, 2008 00:17:35 Сообщений: 4673 Откуда: Я всего лишь плод вашего воображения...
Рейтинг сообщения:0 Медали: 1
Цитата:
Ещё была мысель просто-напросто дублировать каждый байт и браковать передачу при первом же несравнении. По скольку передача занимает всего несколько секунд, а перезагружать станок надо не чаще двух-трёх раз в смену, то это было бы вполне приемлемо. К тому же, контроль в этом случае почти абсолютный. Пока ещё не решил, на каком из двух вариантов остановться.
Нифига контроль не абсолютный. Можеи иметь место некая статическая помеха, которая успешно будет портить один и тот же бит во всех байтах.Хотя это бывает редко, так что можно сделать и так. Но с оговоркой.
Цитата:
А текущий вариант такой: 2 контрольные суммы - XOR и ADD. Это подсказал один человек, у которого это применено на практике.
Не понял. Что такое "2 контрольные суммы - XOR и ADD". Это как?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения