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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д