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);