Хэш код - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, попался дипломный проект на тему составления программы для расчет хэш кода, c# я в принципе знаю очень поверхностно, но программу составил, нужна помощь, возможно как то код можно оптимизировать, сократить. По возможности закомментил и условия в принципе такое: Дается любое слово, которое мы раскладываем согласно ASCII коду, к примеру HASHING - 72 65 83 72 73 78 71, переводить в двоичный вид, 01001000 01000001 и т.д, разделяем число на две части и подставляем по 1111 - М1 = 111101000, М2 = 11111000, М3 = 11110100, М = 11110001 и т.д. и далее начинаем производить расчет, М1 + Н0(00000000) в 10ом виде = 244, и конечная формула: ((H0+M1)^2)*(mod323), (323 число задается вручную). И так повторяем до конца. Сложность была ещё в том что таблица ASCII найденная в интернета, и актуальная на учебе, немного различается, пришлось вносить корректировки. Сам код.
{
        origin:
            string s;
            long ne;
            Console.WriteLine("Введите кодируемое слово");
            s = Console.ReadLine(); 
            Console.WriteLine("Укажите значение n");
            ne = Convert.ToInt32(Console.ReadLine()); //получаем число n
            Console.WriteLine();
            
            int length = s.Length;
            byte[] bytes = Encoding.GetEncoding(1251).GetBytes(s); //Получаем ASCII код
            int[] vich = new int[length];
            int[] f = new int[length];
            string[] F = new string[length];
            
            for (int i = 0; i < length; i++) //Выполнение условия, чтобы совпала таблица кодов с той которой необходимо.
            {
                if (bytes[i] < 240)
                {
                    if (bytes[i] > 127)
                    {
                        vich[i] = bytes[i] - 64;
                        f[i] = Convert.ToInt32(vich[i]);
                    }
                    else
                    {
                        vich[i] = bytes[i];
                        f[i] = Convert.ToInt32(vich[i]);
                    }
 
                }
                else
                {
                    vich[i] = bytes[i] - 16;
                    f[i] = Convert.ToInt32(vich[i]);
                }
                Console.WriteLine("{0} = {1}", s[i],vich[i]);
            }
        //конец 1 блока
 
            for (int i = 0; i < length; i++)
            {
                F[i] = Convert.ToString(f[i], 2).PadLeft(8, '0'); //Добавляем бит если его недостаточно до 8
            }
            //Начало подсчета Мок
            int Mka, N1, N2, N3, N4, N5, N6, x = 0, ye = 0, o = 0, p = 0;
            string[] N = new string[length * 3];
            string[] M = new string[length * 3];
            int rashet = 1;
            string n1, n2, mka = "11110000"; 
            Console.WriteLine();
            for (int i = 0; i < length; i++)
            {
                ye = x + ++x;
                o = p + p++;
 
                string buk = F[i];
                Mka = Convert.ToInt32(mka, 2);
                N1 = Convert.ToInt32(buk) % Convert.ToInt32(Math.Pow(10, Convert.ToString(buk).Length / 2)); //Первая часть битов
                N2 = Convert.ToInt32(buk) / Convert.ToInt32(Math.Pow(10, Convert.ToString(buk).Length / 2)); //Вторая часть битов
                n2 = Convert.ToString(N2);
                n1 = Convert.ToString(N1);
                N5 = Convert.ToInt32(n1, 2);
                N6 = Convert.ToInt32(n2, 2);
                N3 = Mka ^ N5; //Биты подставляются после 1111хххх
                N4 = Mka ^ N6;
                N[o] = Convert.ToString(N4, 2);
                N[ye] = Convert.ToString(N3, 2);
                Console.WriteLine("M{1} = {0}\tM{3} = {2}\n", N[o], rashet++, N[ye], rashet++);
            }
            //Начало подсчета H
            long num, Result;
            Console.WriteLine();
            string H0 = "00000000", M1;
            int t1, t2, hn;
            double[] yd = new double[length * 3];
            double YD;
            long[] er = new long[length * 3];
            int[] T1 = new int[length * 3];
            int[] H = new int[length * 3];
            int[] A = new int[length * 3];
            long[] B = new long[length * 3];
            long[] res = new long[length * 3];
            int[] mod = new int[length * 3];
            string[] Mod = new string[length * 3];
            int[] T2 = new int[length * 3];
            int u = 0, v = 0, q = 0, w = 0, pls;
            t1 = Convert.ToInt32(N[0], 2);
            Console.WriteLine("N = {0}" ,N[0]);
            t2 = Convert.ToInt32(H0, 2);
            hn = t1 ^ t2; 
            M1 = Convert.ToString(hn);
            num = Convert.ToInt32(M1);
            num = Convert.ToInt32(Math.Pow(num, 2)); //Число из степени
            Math.DivRem(num, ne, out Result); //Остаток от деления
            pls = Convert.ToInt32(Result);
            N[0] = Convert.ToString(Result, 2);
            YD = Convert.ToDouble(N[0]);
            Console.WriteLine(" H1 =\t{0:#,###}\t({1})\tM1+H0 =\t{2}", YD, pls, hn);
            length = length * 2;
            for (int i = 1, r = 0; i < length; i++, r++) //Расчет всех H
            {
                q = w + ++w;
                u = v + v++;
                T1[i] = Convert.ToInt32(N[i], 2);//M в десятичном
                T2[i] = Convert.ToInt32(pls);//H в десятичном
 
                mod[i] = T1[i] ^ T2[i];
                Mod[i] = Convert.ToString(mod[i]);
 
                B[i] = Convert.ToInt32(Mod[i]);
 
                er[i] = Convert.ToInt32(Math.Pow(B[i], 2));
 
                Math.DivRem(er[i], ne, out res[i]);
                pls = Convert.ToInt32(res[i]);
                N[i] = Convert.ToString(pls, 2);
                yd[i] = Convert.ToDouble(N[i]);
                Console.WriteLine(" H{1} =\t{0:#,###}\t({2})\tM{1}+H{4} = {3}", yd[i], i + 1, pls, B[i], i); 
            }
            Console.WriteLine();
            ConsoleKeyInfo cki;
            Console.WriteLine("Для повтора нажмите ESC \n");
            do
            {
                cki = Console.ReadKey();
            }
            while (cki.Key != ConsoleKey.Escape);
            Console.Clear();
            goto origin;
        }
В заранее спасибо, учту любые замечания. В принципе она и так работает отлично, но хотелось бы знать что можно упростить.

Решение задачи: «Хэш код»

textual
Листинг программы
using System;
using System.Text;
 
namespace ConsoleApplication198
{
    internal class Program
    {
        static void Main(string[] args)
        {
            do
            {
                Console.Clear();
                Console.WriteLine("Введите кодируемое слово");
                var str = Console.ReadLine();
                Console.WriteLine("Укажите значение n");
                var n = int.Parse(Console.ReadLine()); //получаем число n
                Console.WriteLine();
 
                var hash = GetHashCode(str, n);
 
                Console.WriteLine("Result hash: {0}\r\n", hash);
 
                Console.WriteLine("Для выхода нажмите ESC, для повтора - любую другую клавишу");
            }
            while (Console.ReadKey().Key != ConsoleKey.Escape);
        }
 
        static byte GetHashCode(string str, int divider)
        {
            var bytes = Encoding.GetEncoding(1251).GetBytes(str);
            var hash = (byte)0;
 
            foreach(var b in bytes)
            {
                var left = (byte)(b >> 4);//берем левые 4 бита
                GetHashCode(left, divider, ref hash);
 
                var right = (byte)(b & 0x0F);//берем правые 4 бита
                GetHashCode(right, divider, ref hash);
            }
 
            return hash;
        }
 
        static void GetHashCode(byte m, int divider, ref byte h)
        {
            m = (byte)(m + 0xF0);//добавляем 11110000
            Console.Write("M: {0}   ", ToBin(m));
 
            m = (byte)(m ^ h);//сложение по модулю два с хешем
            Console.Write("M ^ H: {0}   ", ToBin(m));
 
            h = (byte)((m * m) % divider);//возводим в квадрат и берем модуль по основанию divider
            Console.WriteLine("H: {0}", ToBin(h));
        }
 
        //преобразование в строку в бинарном формате, для вывода на экран
        static string ToBin(int v)
        {
            return Convert.ToString(v, 2).PadLeft(8, '0');
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5