ASCII код и Хэш код - C#
Формулировка задачи:
Вложение 572662Добрый день, в теме диплома получил задание на составление программы для расчета хэш кода, вроде бы все хорошо, товарищ с форума так же помог с кодом, но все оказалось не так сладко, так как в расчете слово разбивается согласно ASCII коду, таблица которую использует преподаватель отлична от той, которая является правильной и используется в программе. Я в принципе нашел закономерность и написал небольшой алгоритм чтобы они совпали, но беда в том, что в конечном расчете программа все равно использует то, что не нужно, просьба помочь.
Так же прикрепляю таблицы кодов.(Оригинал - та что используется, актуальная - та что на учебе)
Листинг программы
- namespace ConsoleApplication8
- {
- class Program
- {
- static void Main(string[] args)
- {
- do
- {
- Console.Clear();
- Console.WriteLine("Введите кодируемое слово");
- string s = Console.ReadLine();
- Console.WriteLine("Укажите значение n");
- int n = int.Parse(Console.ReadLine()); //получаем число n
- Console.WriteLine();
- var hash = GetHashCode(s, n);
- Console.WriteLine("Result hash: {0}\r\n", hash);
- Console.WriteLine("Для выхода нажмите ESC, для повтора - любую другую клавишу");
- }
- while (Console.ReadKey().Key != ConsoleKey.Escape);
- }
- static byte GetHashCode(string s, int divider)
- {
- int length = s.Length;
- int[] vich = new int[length];
- int[] f = new int[length];
- byte[] bytes = Encoding.GetEncoding(1251).GetBytes(s);
- //Начало алгоритма
- 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]);
- //конец алгоритма
- }
- var hash = (byte)0;
- for (int i = 0; i < length; i++)
- {
- var left = (byte)(f[i] >> 4);//берем левые 4 бита
- GetHashCode(left, divider, ref hash);
- //Console.WriteLine("left = {0}", ToBin(left));
- var right = (byte)(f[i] & 0x0F);//берем правые 4 бита
- GetHashCode(right, divider, ref hash);
- //Console.WriteLine("right = {0}", ToBin(right));
- }
- 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');
- }
- }
- }
Решение задачи: «ASCII код и Хэш код»
textual
Листинг программы
- byte[] bytes = Encoding.GetEncoding(1251).GetBytes(s);
- =>
- byte[] bytes = Encoding.GetEncoding("CP866").GetBytes(s);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д