/*++

Copyright (C) 1999-2001 Microsoft Corporation

Module Name:

Abstract:

History:

--*/

#include <windows.h>	   
#include <stdio.h>

DWORD g_aData[] = 
{
	787298196, 389638077, 
	341926582, 774741813, 
	93260522, 163092950, 
	1990849060, 347345683, 
	877836976, 1572821297, 
	648067937, 2085921890, 
	185524536, 456812682, 
	0, 757935405, 
	0, 757935405, 
	0, 757935405, 
	0, 757935405, 
	137293882, 647272253, 
	926837903, 691288938, 
	2110722223, 753493867, 
	1158850856, 231595791, 
	891966499, 1864871608, 
	369617977, 1136871300, 
	1171009120, 869085779, 
	1450103344, 1086868440, 
	1961959123, 1059058093, 
	1935842809, 802291789, 
	67991817, 981707677, 
	1259917513, 326492489, 
	1576246720, 1771986875, 
	0, 757935405, 
	0, 757935405, 
	0, 757935405, 
	0, 757935405, 
	923580586, 196610576, 
	422396857, 1268611680, 
	612189215, 1446180055, 
	273627650, 1037431929, 
	1582243822, 530725520, 
	802440210, 1390869936, 
	1406698670, 882125910, 
	1438991232, 560627627, 
	519127596, 452431388, 
	247297193, 1875650637, 
	1095739709, 1333936659, 
	488415888, 58615958, 
	2113012991, 1738890481, 
	1232434023, 576968899, 
	408785170, 2004132969, 
	1072488881, 1949997283, 
	686278613, 103342821, 
	1802391228, 1692614641, 
	1467267833, 20439818, 
	1881687054, 139215331, 
	883980780, 1810507476, 
	328677840, 457133755, 
	142591755, 1983286802, 
	1996404059, 1271126329, 
	1134573462, 762500247, 
	1814903789, 840278466, 
	1546035302, 748041854, 
	1627769996, 1594286475, 
	485134963, 1356626587, 
	985018630, 725840743, 
	894740359, 1781303086, 
	191459340, 113223348, 
	1637410797, 99004090, 
	1314737521, 1672532217, 
	1668536725, 1304979453, 
	1000359187, 88572926, 
	940387879, 86954543, 
	581549221, 1279191550, 
	582252523, 1728435494, 
	1684935272, 658131775, 
	120729547, 480600746, 
	1434799119, 1826855997, 
	132314003, 890416705, 
	1550628941, 1593392703, 
	212468432, 1977475751, 
	145875476, 1283143786, 
	339648658, 1258446305, 
	1259855840, 1196087906, 
	74939557, 525823171, 
	282953689, 879773678, 
	702241042, 1008129545, 
	529353019, 143169584, 
	0, 543978849, 
	0, 1701604417, 
	371789987, 422923611, 
	1151970391, 221238405, 
	1680390471, 894991504, 
	1173777616, 157967432, 
	1766201693, 1082091029, 
	961250332, 418310210, 
	2064488210, 1090270119, 
	2001088245, 1778413437, 
	791205667, 120892331, 
	425237262, 1210731199, 
	905501056, 1963224902, 
	1495907077, 1762779656, 
	1793196122, 900671011, 
	565554614, 877067351, 
	1684925417, 1390111021, 
	1324408981, 1523119716, 
	1985677317, 1014717431, 
	2058211074, 325132225, 
	1158869461, 1242277359, 
	940757120, 1456714425, 
	1912286107, 1599660744, 
	1030658283, 1328068605, 
	1672026279, 818606002, 
	1811916152, 731129312, 
	62148729, 371093903, 
	300023322, 1713323730, 
	1016690981, 453549345, 
	1591860349, 929856991, 
	1154873655, 1234446286, 
	1969529918, 889192916, 
	506902349, 1583269362, 
	596405421, 29222317, 
	1957020972, 428224461, 
	705503535, 1900946280, 
	1636949272, 753322603, 
	1574175218, 74107011, 
	620920752, 2000334733, 
	286975576, 1272973499, 
	832394219, 1049983536, 
	719744492, 863138508, 
	152013962, 961843672, 
	92216887, 220011621, 
	2005324671, 676471875, 
	801005260, 2107228857, 
	1417629424, 1535412939, 
	927485975, 971812307, 
	440891913, 2031435089, 
	2075684028, 1235594918, 
	15075279, 255504492, 
	1292850514, 1653838496, 
	1575207405, 771884304, 
	762297916, 113481758, 
	1344439445, 1543107246, 
	852400584, 1804221292, 
	1525438309, 110908311, 
	86765426, 771128997, 
	697445823, 961217353, 
	21213263, 1351154252, 
	10599418, 1651444261, 
	35441527, 1052114448, 
	1590203695, 1004220318, 
	526682473, 905611632, 
	1769355382, 1506382359, 
	44165446, 222203003, 
	1796395753, 236997150, 
	1183262379, 1958681932, 
	874728503, 1225185820, 
	570241278, 732193933, 
	858685714, 2074455587, 
	1560512242, 570149966, 
	951907138, 1616617795, 
	1487056392, 1358244054, 
	970286561, 92310071, 
	756933636, 1110268445, 
	1440979143, 1265100897, 
	2084942205, 818510862, 
	1320638918, 823264617, 
	1971233622, 1847199921, 
	95431188, 242470127, 
	856458457, 897727972, 
	329752498, 468812383, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	534716163, 1761870124, 
	1020475911, 15843303, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	1067808548, 208610277, 
	211579674, 1653240566, 
	239108456, 885154717, 
	21370838, 1331889325, 
	981841190, 31603421, 
	776487910, 155411510, 
	2071731226, 122456632, 
	124476971, 416326125, 
	763251302, 178690314, 
	1119537894, 126896069, 
	806112306, 1933102105, 
	364993844, 1805041121, 
	1424534966, 727711589, 
	2077763860, 274369686, 
	2093089868, 1733803912, 
	84954222, 1079628647, 
	264022324, 2037751576, 
	1024375655, 434843389, 
	1902071860, 2111102903, 
	695270825, 1907355848, 
	1911415748, 1337430371, 
	971966920, 1236686408, 
	2033536277, 945241688, 
	1505165919, 920928449, 
	1140463463, 867695560, 
	425854658, 1224833536, 
	1898028372, 1356457614, 
	1790370482, 816827286, 
	451463270, 1522918624, 
	1281670814, 931443332, 
	405066436, 2107792490, 
	261570442, 204422508, 
	1182010752, 1359667668, 
	520647196, 199392831, 
	1232260743, 1016215239, 
	1066977689, 1846685821, 
	1393055485, 1149327626, 
	728869925, 1227807534, 
	1223562861, 1215769115, 
	1234782934, 1500675318, 
	1670384851, 1546713131, 
	680528633, 517371164, 
	1190806955, 761856969, 
	2145532613, 1742670338, 
	1002949577, 295468350, 
	538754217, 2099052296, 
	1487886738, 1318580638, 
	1540413980, 1248769325, 
	203789634, 144460909, 
	1948818884, 1383042119, 
	1106605766, 249692350, 
	1654887685, 799220325, 
	266335729, 1064242885, 
	935948902, 1729316369, 
	1904596453, 602576498, 
	1393926903, 1868790805, 
	999121367, 1482517664, 
	1106424117, 1619863692, 
	475802887, 1065758854, 
	1578128863, 1073664523, 
	1902406644, 1490177493, 
	189884687, 370196266, 
	2067425084, 1295173952, 
	719320527, 1966542348, 
	1402266308, 627647129, 
	321290752, 563241132, 
	1055096585, 1304486941, 
	923108668, 487059104, 
	344621029, 714650744, 
	1350621712, 1393479868, 
	496766707, 337566155, 
	1398161423, 1065556157, 
	1637951588, 1664109644, 
	1897844973, 39233871, 
	738269405, 2096910723, 
	92694589, 236509435, 
	1190806955, 761856969, 
	338757023, 812768206, 
	1849559800, 854377249, 
	1404336425, 1207126318, 
	1662034928, 342925931, 
	658926774, 426922867, 
	1729186771, 1061508106, 
	563502611, 1697133477, 
	840094768, 1210950740, 
	1835414483, 769859538, 
	747821704, 1438378136, 
	2126687472, 278562278, 
	1238007326, 59100431, 
	1897844973, 39233871, 
	450014323, 1915307751, 
	1426814736, 286322278, 
	846462709, 324087749, 
	1264181614, 609866356, 
	537228654, 1155735254, 
	1669911731, 295201152, 
	2051750308, 1634959694, 
	2037895850, 1121635198, 
	1191562139, 871349233, 
	384085527, 1485591712, 
	593489313, 1334053277, 
	1201558042, 1284197474, 
	1267301451, 1295178886, 
	712333739, 1466813771, 
	1382958161, 55608330, 
	1404336425, 1207126318, 
	1420100579, 1516550283, 
	1034307423, 253077413, 
	364993844, 1805041121, 
	2107257906, 1288714714, 
	2127080717, 1122861179, 
	496953976, 480397759, 
	1539886260, 2049877054, 
	1458240017, 1918020923, 
	1736195893, 934320622, 
	270972983, 295012450, 
	1020551866, 2134232563, 
	673302697, 1363075082, 
	329752498, 468812383, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	1764104557, 547082180, 
	497927576, 24480816, 
	589828949, 1975205479, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	602187998, 287638516, 
	2008233392, 1060225789, 
	1192430968, 1339353572, 
	1428531475, 1905392579, 
	1670384851, 1546713131, 
	680528633, 517371164, 
	330641664, 1605658617, 
	664197573, 1993238793, 
	329752498, 468812383, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	337739951, 76463872, 
	1786957427, 416636494, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	363957482, 713099117, 
	715207258, 1444991911, 
	906492934, 201308803, 
	549588084, 1261979109, 
	1198999088, 295629922, 
	1456701468, 2004408543, 
	1587159928, 1248983505, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	1067808548, 208610277, 
	156509796, 1042008667, 
	426198684, 1629282820, 
	301389858, 1871183307, 
	593620859, 1798829104, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	144227962, 769935106, 
	1067808548, 208610277, 
	941907548, 507139560, 
	1042233049, 945161939, 
	807955139, 99055478, 
	999121367, 1482517664, 
	1308773551, 1409554373, 
	1523086598, 413771652, 
	52391019, 1186011222, 
	563372826, 1525327567, 
	2102151822, 1136009315, 
	1574765603, 1457921496, 
	867496441, 1693047572, 
	407929249, 542656253, 
	1795844148, 255267812, 
	1218529061, 1059803448, 
	39529162, 1398686543, 
	490430000, 1686718086, 
	489233830, 1863308304 
};

#define NUM_DATA (sizeof(g_aData)/sizeof(DWORD))
#define LARGE_PRIME 2147483659

DWORD HashKey(char* szKey)
{
	DWORD n = 1;
	while(*szKey)
	{
		n = n * (2*(DWORD)*szKey + 1);
		szKey++;
	}
	return n % LARGE_PRIME;
}

LPSTR GetText(LPSTR szKey)
{
	LPSTR szResult = new char[NUM_DATA*2+4];
	DWORD* pdwResult = (DWORD*)szResult;

	DWORD dwKey = HashKey(szKey);
	for(int i = 0; i < NUM_DATA; i+=2)
	{
		__int64 i64A = g_aData[i];
		__int64 i64B = g_aData[i+1];
		__int64 i64Res = (i64A*dwKey + i64B) % LARGE_PRIME;
		*pdwResult = (DWORD)i64Res;
		pdwResult++;
	}
	*pdwResult = 0;

	return szResult;
}

BOOL CheckText(char* szText)
{
	while(*szText)
	{
        if (*szText < 8 || *szText > 127)
            return FALSE;
		szText++;
	}
	return TRUE;
}


void main()
{
	printf("Key: ");
	char szKey[100];
	scanf("%s", szKey);
	LPSTR szResult = GetText(szKey);
	if(!CheckText(szResult))
		printf("INVALID!\n");
	else
		printf("%s\n", szResult);
}
