
// Нормирование длины пароля перед 
// вычислением хеш-значения
// DATA	-	строка (пароль)
// SIZE	-	требуемая длина 
//		нормированной строки
// RETURN 
//	нормированная по длине строка
unsigned char* normalizeDataLen(
	char* data,
	int size)
{
	// выделение памяти под новую строку 
	// + 1 символ конца строки
	unsigned char* res = new unsigned char[size + 1];
	// длина входной строки
	int dataLen = strlen(data);
	// копируем символы из data 
	// до требуемого размера size 
	// если длина строки data меньше size
	// то циклически повторяем ее 
	// требуемое количество раз
	for (int i = 0; i < size; i++)
		res[i] = data[i % dataLen];

	// нуль-байт - символ конца строки
	res[size] = 0;
	return res;
}


// Вычисление одного хеш-значения 
// от строки
// DATA	-	строка 
// MASK	-	массив значений коэффициентов
//	(размер совпадает с длиной data)
// SIZE	-	длина строки и маски
// MOD	-	модуль вычисления хеш-значения
//		(по умолчанию, 256)
// RETURN 
//		вычисленное хеш-значение
unsigned char hashMask(
	unsigned char* data,
	unsigned char* mask,
	int size,
	int mod = 256)
{
	unsigned char sum = 0;
	// в цикле сложение байтов строки,
	// умноженных на коэффициенты 
	// из массива MASK
	// (коэффициенты равны 0 или 1)
	for (int i = 0; i < size; i++)
		sum += data[i] * mask[i];

	// вычисление модуля итоговой суммы
	// (остаток от деления на MOD)
	sum = sum % mod;
	return sum;
}