1. C# / Говнокод #13314

    +134

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    using System;
    using System.Security.Cryptography;
    
    namespace sha1_calc
    {
        class Program
        {
            static void Main(string[] args)
            {
                SHA1 sha = new SHA1CryptoServiceProvider();
                foreach (var fname in args)
                {
                    Console.WriteLine("file: " + fname);
                    try
                    {
                        System.IO.FileStream fs = System.IO.File.Create(fname);
                        byte [] res = sha.ComputeHash(fs);
                        fs.Close();
                        Console.Write("0x");
                        foreach (var i in res)
                        {
                            Console.Write(i.ToString("X"));
                        }
                        Console.WriteLine();
                        Console.WriteLine("---------------------------------");
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine("error: " + e);
                    }
                }
                Console.ReadKey();
            }
        }
    }

    Скачал парочку образов и решил проверить их чексуммы. Протестировал программу на скачанных файлах. Удивился, почему же у них хеши одинаковые?

    Запостил: Xom94ok, 05 Июля 2013

    Комментарии (103) RSS

    • Сразу видно настоящего windows-программиста.
      1) Изобрести проблему.
      2) Самолично решить проблему не самым очевидным способом.
      Ответить
      • Даже не знаю - радоваться, что меня кто-то назвал программистом, либо горевать от остального. Добавлю, пожалуй, от себя пункт 3: "Использовать стильный, модный, молодежный стек технологий".
        Ответить
      • да если бы решили...
        Я так понимаю, скачанные файлы пришлось скачивать заново...
        Ответить
        • Да, тут подвело меня моё знание матчасти. Тогда заменим слово на "решать".
          Ответить
      • Это начинающи, матерый Виндовс-программист скачает из интеренета программу SuperSHA1Calculator++, а потом еще найдет к ней кряк.
        Ответить
        • Гуру сделает то же самое, но без переустановки винды.
          Ответить
    • Для тех, кто не писатель на сишарпе, Create() затерло каждый скачанный файл?
      Ответить
      • Именно. В WinAPI есть очень функция для создания файлов с логичным именем CreateFile, а также есть функция для открытия файлов с не менее логичным именем CreateFile. Вот вся эта логичность и проявилась в 16-й строке.
        Ответить
        • А Open() тебе не подходит? (подсказка: вопрос риторический).
          Ответить
    • А зачем пересоздавать то файлы? Или прогер хотел их открыть?
      Ответить
    • А я угадаю эту мелодию с одной ноты:
      sha1sum some.iso
      Ответить
      • А ошибки этой поебени ты как обрабатывать собираешься?
        Ответить
        • Какие ошибки? Файл не найден или файл не читается что-ли?

          Из скрипта - проверю код возврата.
          Из консоли - так она на stderr валит ошибки.

          Что тебе не нравится, guest?

          P.S. Более годный вброс по поводу *sum звучит так: "а считать sha1 от файлов в подкаталогах ты как собираешься?".

          P.P.S. Или ты о том, что приведенная мной команда генерит чексуммы а не сверяет их? Тогда открой для себя опцию -c.
          Ответить
          • Да, именно так: не читается, не найден итд. Какие сообщения будем выкидывать? "sha1sum обосралси"?

            Файлы можно и самому искать, потери скорости при этом не будет.
            Ответить
            • $ sha1sum * >checksum
              $ cat checksum
              da39a3ee5e6b4b0d3255bfef95601890afd80709  1.txt
              a2b6e48b91fbaa173121eccafa8d27b5d6847ee8  2.txt
              $ sha1sum -c checksum
              1.txt: ЦЕЛ
              2.txt: ЦЕЛ
              $ echo $?
              0
              $ echo foo >2.txt
              $ sha1sum -c checksum
              1.txt: ЦЕЛ
              2.txt: ПОВРЕЖДЁН
              sha1sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпала 1 вычисленная контрольная сумма
              $ echo $?
              1
              $ rm 1.txt
              $ sha1sum -c checksum
              sha1sum: 1.txt: Нет такого файла или каталога
              1.txt: невозможно открыть или прочитать
              2.txt: ПОВРЕЖДЁН
              sha1sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпала 1 вычисленная контрольная сумма
              sha1sum: ПРЕДУПРЕЖДЕНИЕ: не удалось прочитать 1 файл из списка
              $ echo $?
              1
              Ответить
              • Ну и? Какие ошибки ты собираешься показывать пользователю? Как ты собираешься показывать прогресс?
                >Я в курсе, кэп. Я просто говорил, что вброс об этом был бы лучше вброса об обработке ошибок.
                Лучше - так вбрось. Я спросил то, что мне показалось важнее.
                Ответить
                • > Лучше - так вбрось.
                  Теперь уже не интересно. Ты же уже написал, как эта проблема решается, а я согласился с данным решением.

                  > Я спросил то, что мне показалось важнее.
                  Ок.

                  > Какие ошибки ты собираешься показывать пользователю? Как ты собираешься показывать прогресс?
                  ОП'у надо было проверить файлы, а не писать мегаполезную тулзу с прогрессом и шлюхами. Эта вполне конкретная задача решается вполне конкретной командой sha1sum -c checksums. И я не думаю, что выхлоп этой команды кому-то окажется непонятным.
                  Ответить
                  • Проверка подразумевает информирование пользователя о том, что делает программа и не повисла ли она. sha1sum с большими файлами этот сценарий проваливает на ура.
                    Ответить
                    • консольные утилиты часто используются в скриптах, где незачем засирать stdout всякой фигней
                      Ответить
                      • А для этого есть два потока: полезности выводим в stdout, а всякую фигню для юзера в stderr.
                        Ответить
                        • И как ты хуйню из ыtderr собираешься выводить, скажем, в гуе?
                          Ответить
                • > Какие ошибки ты собираешься показывать пользователю? Как ты собираешься показывать прогресс?
                  Естественно, если бы я надумал писать гуишную прогу для сверки хешей (а я никогда не надумаю ее писать, т.к. мне это нахуй не нужно, для насущных целей мне всегда хватало и консольной, задача унылая и не интересная, и платить мне за нее явно никто не будет), то я бы не пользовался бекендом в виде *sum, а воспользовался бы какой-нибудь вменяемой криптобиблиотечкой, которой можно скармливать поток кусками, а не целиком (ну или, как вариант, есть колбеки о прогрессе расчета).
                  Ответить
                  • А ты хочешь проверять файл на пару терабайт молча? Чтобы юзер думал, то ли программа повисла, то ли чем-то занята?
                    Ответить
                    • > Чтобы юзер думал, то ли программа повисла, то ли чем-то занята?
                      Ну я же написал, что "я бы не пользовался бекендом в виде *sum, а воспользовался бы какой-нибудь вменяемой криптобиблиотечкой, которой можно скармливать поток кусками, а не целиком (ну или, как вариант, есть колбеки о прогрессе расчета)". Для чего, по-твоему, мне нужна загрузка кусками или колбек? А нужна она именно для индикации прогресса.

                      > А ты хочешь проверять файл на пару терабайт молча
                      Да, лично меня, (а не абстрактных юзеров моей ненаписанной сверялки сумм) такое поведение никогда не бесило.
                      Ответить
                      • Ну мы же тут обсуждаем прграмму. То, что ты делаешь "риально удобно, риально падсибя" на самом деле никого не интересует.
                        Ответить
                        • ...ибо оно и есть говногод по оперделению, т.к. другие им пользоваться не смогут.
                          Ответить
                        • Ну так я и ответил тебе, guest, как бы я поступил в этой абстрактной программе. Есть какие-то претензии или вопросы к фразе написанной курсивом?
                          Ответить
                          • Программа - не говнокод только потому, что ты для себя сделал бы по-другому.
                            Ответить
                            • Прости, не понял эту реплику.

                              Ты имел в виду, что если я напишу программу так, что она будет удобна не только для меня, но и для кого-то еще, то она не будет говнокодом? Ну да, в этом что-то есть. И этой мысли не хватает многим авторам опенсурсных программ.
                              Ответить
                              • Нет, я имею в виду, что если ты бы падсибя сделал по-другому, то это ни значит ничего. Вообще. Потому, что критерии говнокодности выставляешь ты и, соответственно, это мнение важно только для тебя.

                                А юзабилити и швабодка - вечная тема для холиваров, причем юзабилити как для юзеров, так и для программеров (в частности, в апинсорсе никогда не бывает коментов к апи, если не брать стандартные библиотеки языков).
                                Ответить
                              • Если ты ее напишешь для себя - она почти гарантированно будет говнокодом для других.
                                Ответить
                            • Программа не говнокод, если в ней нет рюшечек для юзера, или комментариев, или переменные называются А, В, С.
                              Ответить
                              • Т.е. если переменные называются не A,B,C, и есть комментарии - это явный говнокод?
                                Ответить
                                • Лунная матлогика, помоги!)

                                  Из того, что((нет рюшечек для юзера) или (нет комментариев) или (переменные называются А, В, С)) не следует что код - говнокод.


                                  если переменные называются не A,B,C, и есть комментарии то код может быть как говнокодом, так и годнокодом
                                  Сие я хотел сказать)
                                  Ответить
                    • Дак юзер или питух? Ты уж определись - я могу определить работает ли программа или нет, хотя я рядовой юзер:
                      # pwd
                      /home/share/Anime/TIME_OF_EVE
                      # ls -l time_of_eve.mkv 
                      -rw-r--r-- 1  19608456978 дек 12  2011 time_of_eve.mkv
                      #sha1sum time_of_eve.mkv &
                      #iostat
                      Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
                      dm-0            189.00     78692.00         0.00     157384          0
                      #top
                      PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM     TIME+ COMMAND    
                      16599 root      20   0  6080  592  500 D  27.3  0.0   0:04.25 sha1sum


                      Ты можешь посмотреть кто что открыл, какая тулза тянет ИО(iotop) и т.п. - в кедах это можно даже в гуйне поглядеть.

                      Ты путаешь домохозяек и юзеров, поэтому не путай.
                      Ответить
                  • >(а я никогда не надумаю ее писать, т.к. мне это нахуй не нужно, для насущных целей мне всегда хватало и консольной, задача унылая и не интересная, и платить мне за нее явно никто не будет)
                    Спасибо, что ты об этом рассказал, буду знать, что ты настолько крут, что всякой хуйней не занимаешься.
                    Ответить
                    • > ты настолько крут, что всякой хуйней не занимаешься
                      Да не, хуйней позаниматься можно, если она интересная или за нее платят. Но кому нужна очередная унылая сверялка сумм, коих и без меня полным-полно?
                      Ответить
                      • Нет, просто эта информация была для меня очень важна.
                        Ответить
                    • P.S. Кстати, тотал-коммандер научился проверять sha? md5 то он черти-когда умел. И прогресс там был.
                      Ответить
                      • Умеет, но медленнее sha1sum, забирает весь проц, когда sha1sum, ест %80-90 и судя по всему, упирается в диск. Зато там есть прогресс.
                        Ответить
                      • 7.04 не умел, 7.57 - считает. Точный промежуток вычислять лениво.
                        Ответить
                        • При том, что последняя - 8.01
                          Ответить
                          • Если б он уже юникод осилил. На что его можно поменять? Он даже в хрюше начинает раздражать.
                            Ответить
                            • А FAR юникод осилил! И к нему есть плагин Integrity Checker с поддержкой md5, sha1 и с индикатором прогресса.
                              Ответить
                              • Зачем мне консольная хуйня на 1080p? В 98м он был крут.
                                Ответить
                                • Растяни его пошире. Насколько помню виндовая консоль тоже умеет растягиваться, а фар умеет следить за ее размером.
                                  Ответить
                                  • Да мне в принципе не нужен консольная хуйня-файлменеджер в 2013 году.
                                    Ответить
                                  • Растягиваться умеет только анус линуксоидов.
                                    Ответить
                          • Коммандер не нужен. Там под конец только свистелки.
                            Ответить
                • > Как ты собираешься показывать прогресс?
                  Да легко: pv ubuntu.iso | sha1sum
                  Ответить
                  • pv эт че?
                    Ответить
                    • Типа cat'а, но с индикацией прогресса.
                      Выглядит примерно так:
                      113MB 0:00:06 [69,7MB/s] [>                                   ]  0% ETA 0:10:35
                      Ответить
                  • Спасибо, не знал про эту тулзу.
                    Ответить
                  • И вместо имени файла будет что?
                    Ответить
            • > Файлы можно и самому искать, потери скорости при этом не будет.
              Я в курсе, кэп. Я просто говорил, что вброс об этом был бы лучше вброса об обработке ошибок.
              Ответить
              • Да еб твою мать, тут же мой комент был.
                Ответить
                • А не, вот он http://www.govnokod.ru/13314#comment186200
                  Ответить
                • Забыл где "пометил территорию"?
                  Ответить
                  • Решил ответить на 2 комента в одном, а потом барабашка померещился. Все-таки дерево не на 100% удобно.
                    Ответить
                    • Самая жопа случается после десятка комментов, когда оно перестает быть деревом, и превращается в линейное месиво, в котором не поймешь кто что кому писал ;(
                      Ответить
                      • Кнопки "родитель" нет.
                        Ответить
                        • Кстати, мое предложение: при наведении мыши на ссылку на родителя подсвечивать пост. Или лучше, если дерево уплощается, подсвечивать его сразу.
                          Ответить
                          • Мне в последнее время кажется, что линейная структура была бы удобней: сейчас приходится прокручивать длинные треды в поисках новых комментов, а после обновления страницы с них слетают пометки.

                            А родителя можно показывать как на бордах, во всплывающем диве при наведении на ссылку на него.
                            Ответить
                            • Древовидная борда? Еще глобальную нумерацию коментов показывать, ссылку в виде >>номер, и заебись будет.

                              Для последних коментов есть сток, он только работает хуево.
                              Ответить
                              • Размера стока зачастую не хватает. Слишком мало комментариев он показывает. Если бы в него добавили переход на следующую страницу...
                                Ответить
                                • Там они еще и пропадают, даже если их не редактировали.
                                  Ответить
                              • > Для последних коментов есть сток, он только работает хуево.
                                Да вот в стоке не последние комменты, к сожалению. Там один коммент на тред ;(
                                Ответить
                            • Всплытие при наведении может раздражать, уж лучше по клику что-нибудь делать.

                              На мой взгляд удобнее было бы по клику выполнять скроллинг на комментарий, чтобы страница не обновлялась. Возможно, даже с эффектом подмигивания преамбулы комментария. Так будет виден весь контекст.

                              А чтобы можно было вернуться, показывать ссылки не только на родителя, но и на потомков в разворачивающемся по клику списке.
                              Ответить
                              • >Всплытие при наведении может раздражать,
                                Зайди на двощ и протестируй.

                                >преамбулы
                                Это типа родитель? А что если он не помещается на экране?
                                Ответить
                                • > Зайди на двощ и протестируй.
                                  Видел. Неюзабельно.

                                  > А что если он не помещается на экране?
                                  Можно сделать прокрутку по клику же.
                                  Ответить
                                  • >Видел. Неюзабельно.
                                    Да ты охуел. Ну давай, предложи лучше.

                                    >Можно сделать прокрутку по клику же.
                                    Как на хабре?
                                    Ответить
                                    • Ну, например, как на Хабре. Давайте обсудим недостатки их метода.

                                      Мне кажется, например, что «вилка вниз» неинтуитивно работает.
                                      Ответить
                                      • Одна из главных проблем дерева имхо - два ответа на один комент, даже от одного юзверя, обрастают своими деревьями и разносятся так, что хер найдешь. Как найти всех детей одного родителя?
                                        Ответить
                                        • > Как найти всех детей одного родителя?
                                          Есть такое. А если добавить кнопку для сворачивания всех деревьев потомков, так чтобы под данным комментарием оставались видимыми только корни этих деревьев?
                                          Ответить
                                          • Хотелось бы увидеть это в деле, как быстро это будет работать.
                                            Ответить
                            • Два чая этому господину. С подсветкой вообще беда, когда пост на 400 комментов, и где-то один новый, в середине.
                              В линейном такой херни нет. Да и там легко отложить тред на "почитать потом", постранично.
                              Дискуссии не такие разветвлённые получаются, но как по мне, это только плюс.
                              Ответить
                              • Все проблемы новых коментов решаются работающим стоком.
                                Ответить
                                • Тогда он должен быть глубже раза в два-три. Сейчас триста комментариев в день - норма. Плюс, там нельзя понять, кто кому чего сказал.
                                  Ответить
                              • Можно не ограничивать ветвление, а просто убрать отступ, чтобы текст не сжимался.

                                Как определять, что куда относится? Ссылки на родителя и на потомков.

                                Да и потом существуют компромиссные схемы с отображением двух уровней:
                                1. Корневые комментарии.
                                2. Ответы на корневые и ответы на ответы.

                                Примеры в действии:
                                А. http://holywars.ru/comments/653

                                Б. http://stackoverflow.com/questions/14589346/

                                Вроде и лесенки нет, и ветвление делать можно.
                                Ответить
                                • Если уж менять, то делать закос под стековерфлоу нелогично, потому что они сами признают, что комментарии к ответам при количестве комментариве >5 желательно выносить в чат вообще. Поэтому труёво сделать, вы удивитесь, как на лоре. На хабре говняно придумано с ветками. Ветки вообще не нужны. Видимая структура должна быть линейной, а под ней уже может быть и дерево.
                                  Первый, кто скажет съебнуть на лор - хуй.
                                  Ответить
                                  • А как на лоре? Ни разу там больше минуты не был. Банка сгущенки в анусе не появится?
                                    Ответить
                                    • Не должна, а почему она там должна быть?)

                                      Там просто в заголовке комментария есть ссылка на пост, на который отвечаешь, и можно удобно прыгать туда-сюда.
                                      Ответить
                                      • Блядь, ну что за хуйня? Как теперь на коменты отвечать?
                                        Ответить
                                • И до какого уровня ты собираешься ветвиться? Все движки, что я видел, имели какое-то ограничение правого края коментов, или ты ограничиваешь ветвление, или коменты становятся шириной 5 пикселей.

                                  SO ни в жопу ни в пизду, коменты там очень неудобные и ссылка на автора не для этого. Ответы на ответы там линейные, да и формат ресурса не тот. Холиварс вообще непонятно зачем.
                                  Ответить
                                • Можно оставить древовидность, но не отодвигать комментарий, а ставить стрелочку или иную метку, если его не нужно отодвигать. Например, если у родителя больше нет комментариев, или у родителя родителя нет, или при выполнении этих двух условий. Такой подход значительно сократит ширину в большинстве случаев на ГК.

                                  Примерная демонстрация:
                                  function siblings(elem){
                                    var allSiblings = elem.parentNode.childNodes, count = 0;
                                    Array.prototype.forEach.call(allSiblings, function(elem){
                                      if(elem.tagName == 'LI') ++count;
                                    });
                                    return count;
                                  }
                                  
                                  var comments = document.getElementsByClassName('hcomment');
                                  
                                  for(var i=0; i<comments.length; ++i){
                                    var comment = comments[i];
                                    if(siblings(comment) > 1 || siblings(comment.parentNode.parentNode) > 1) continue;
                                    var author = comment.getElementsByClassName('entry-author')[0];
                                    var label = document.createElement('span');
                                    label.innerHTML = '&nbsp;&#9720;';
                                    author.parentNode.insertBefore(label, author);
                                    comment.parentNode.style.marginLeft = '0px';
                                  }


                                  P.S. Этот код не борется с
                                  div.entry-comments ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul .hcomment ul {
                                    margin-left: 0;
                                  }
                                  Ответить
                                  • Няша какая... А для скругления дивных уголков, небось, jQuery используете?
                                    ul.treeHelp>li	{padding-top:5px}
                                    ul.treeHelp>li>a {font-weight:bold}
                                    ul.treeHelp a.active{background:url(//s.server.com/img/arrow.right.gif) no-repeat right center;padding-right:10px}
                                    ul.treeHelp,
                                    ul.treeHelp ul.c	{margin-left:15px}
                                    ul.treeHelp li:hover,
                                    ul.treeHelp ul.c li:hover
                                    		{list-style-image:url(//s.server.com/img/bulletList.png)}

                                    <ul class="treeHelp">
                                    	<li><a href="#">I want cookie</a>
                                    		<ul class="c">
                                    			<li><a href="#">I want cookie</a></li>
                                    			<li><a href="#">I want cookie</a></li>
                                    			<li><a href="#">I want cookie</a>
                                    				<ul class="c">
                                    					<li><a href="#">I want cookie</a></li>
                                    					<li><a href="#">I want cookie</a></li>
                                    ...
                                    Ответить
                                    • > Няша какая... А для скругления дивных уголков, небось, jQuery используете?

                                      Если надо скруглить уголки у каждой третьей дивки, содержащей ровно две зелёные кнопки, и всё это на странице, которую я вижу на сайте незнакомого дяди, то да.

                                      Во-первых, тот кусок кода был написан лишь для того, чтобы каждый желающий мог выполнить его в консоли своего браузера (это не было предложением вставить код на страницу для администрации ГК) и понять, о чём я говорю. Прошу прощения, если он не оказался кроссбраузерным.

                                      Во-вторых, я не в силах выразить в CSS условия "у ul есть <= 1 детей li" и "у ul есть > 1 детей li". Не стоит говорить и о полном условии "у ul есть <= 1 детей li и этот ul находится внутри ul, у которого есть только один ребёнок li".
                                      К тому же, надо будет переписать условия прекращения отступов, которое станет зависеть от содержимого дерева комментариев. Либо понижать вложенность не отступами, а перемещением нужных элементов внутри DOM.

                                      В общем, решать вопрос следует либо на сервере, либо долго думать над CSS. Для всего остального есть JS.
                                      Ответить
    • ГК тут не только в Create. Кто поток закрывать будет? Для вас специально using придумали.
      Ответить
      • >>fs.Close();
        гм
        Ответить
        • Если компутхеш вылетит с экцепшеном - не сработает.
          Ответить
          • Да, надо вынести Close() в finally. А ещё лучше использовать using.
            Ответить
          • имхо, в таких прогах это не имеет особого значения. Одноразовый же код. Давайте теперь и тесты к нему напишем, угу.
            Ответить
            • Так тест к ней @Xom94ok уже написал накачал ;)

              Протестировал программу на скачанных файлах.

              P.S. Я пояснял guest'у почему fs.Close() в строке не достаточно. А про то, что в одноразовом коде на все это насрать - полностью согласен.
              Ответить
              • не хватало для ровного счета одного коммента.
                Ответить
    • Очень хороший тематический сайт о играх. Скачать игры очень легко и доступно каждому, тем более через торрент. Ежедневные обновления и всегда отличные игры. Отзывчивая администрация сайта ежедневно помогает всем, кто не понимает как запустить, установить или скачать игру. Сайт полностью уникален, никакого коллипаста. Всем советую!!! freepc-games.ru
      Заходите к нам:
      freepc-games.ru
      Ответить

    Добавить комментарий