diff --git a/programs/cmm/examples/array.c b/programs/cmm/examples/array.c
new file mode 100644
index 0000000000..0920ae72b0
--- /dev/null
+++ b/programs/cmm/examples/array.c
@@ -0,0 +1,61 @@
+#define MEMSIZE 4096*200
+
+#include "../lib/window.h"
+#include "../lib/array.h"
+
+window win1=0;
+void main()
+{
+	win1.background = 0xFFFFFF;
+	win1.left = 200;
+	win1.top = 200;
+	win1.caption = "Stress test";
+	win1.ondraw = #draw_window;
+	win1.create();
+}
+
+Array a = {0};
+Dictionary b = {0};
+void draw_window()
+{
+	dword size = 10000;
+	dword i = 0;
+	dword y = 10;
+	i = size;
+	/* ints */
+	a.init(0);
+	while(i){
+		a.set(i,i);
+		i--;
+	}
+	a.set(120,222);
+	a.set(9990,345);
+	i = size;
+	while(i){
+		if (a.get(i) != i) 
+		{
+			WriteText(15, y, 0x81, 0xFF0000, itoa(i));
+			WriteText(95, y, 0x81, 0xFF0000, itoa(a.get(i)));
+			y += 25;
+		}
+		i--;
+	}
+	/* strs */
+	b.init(0);
+	i = size;
+	while(i){
+		b.set(itoa(i),i);
+		i--;
+	}
+	b.set("123","Okey");
+	i = size;
+	while(i){
+		if (b.get(itoa(i)) != i) 
+		{
+			WriteText(15, y, 0x81, 0xFF0000, itoa(i));
+			WriteText(95, y, 0x81, 0xFF0000, b.get(itoa(i)));
+			y += 25;
+		}
+		i--;
+	}
+}
diff --git a/programs/cmm/lib/array.h b/programs/cmm/lib/array.h
index e55ae1809c..b3f621712f 100644
--- a/programs/cmm/lib/array.h
+++ b/programs/cmm/lib/array.h
@@ -3,6 +3,8 @@
 #ifndef INCLUDE_ARRAY_H
 #define INCLUDE_ARRAY_H
 
+#include "../lib/crc32.h"
+
 // Array memory: [dword key][byte flags][dword left][dword right][dword value] -> 17 bytes = 1 position
 // If key don't exists then value == 0
 :struct Array
@@ -20,6 +22,7 @@
 
 :void Array::reallocMemory(dword newSize)
 {
+	newSize *= 17;
 	memory = realloc(memory, newSize);
 	lenInitSize = newSize;
 }
@@ -34,25 +37,27 @@
 	IF (flags & 001b) && (DSDWORD[address] > key) RETURN recursiveIndex(key, DSDWORD[address + 9]); // right tree
 	RETURN address;
 }
+
 :byte Array::init(dword size)
 {
-	IF(!size) RETURN 0;
+	dword pointer = 0;
+	if (!size) size = 8;
 	IF(!memory)
 	{
 		lenInitSize = size * 17;
 		memory = malloc(lenInitSize);
-		EBX = memory;
-		DSDWORD[EBX] = 0;
-		DSBYTE[EBX + 4] = 0;
-		DSDWORD[EBX + 5] = 0;
-		DSDWORD[EBX + 9] = 0;
-		DSDWORD[EBX + 13] = 0;
+		pointer = memory;
+		DSDWORD[pointer] = 0; pointer += 4;
+		DSBYTE[pointer] = 0; pointer += 1;
+		DSDWORD[pointer] = 0;pointer += 4;
+		DSDWORD[pointer] = 0;pointer += 4;
+		DSDWORD[pointer] = 0;
 		offsetMemory = 17;
 		RETURN 0xFF;
 	}
 	IF(size > lenInitSize)
 	{
-		reallocMemory(size * 17);
+		reallocMemory(size);
 		RETURN 0xFF;
 	}
 	RETURN 0;
@@ -97,11 +102,11 @@
 		DSDWORD[address + 13] = data;
 		RETURN 0xFF;
 	}
-	DSDWORD[newOffset] = key;
-	DSBYTE[newOffset+4] = 0;
-	DSDWORD[newOffset+5] = 0;
-	DSDWORD[newOffset+9] = 0;
-	DSDWORD[newOffset+13] = data;
+	DSDWORD[newOffset] = key; newOffset+=4;
+	DSBYTE[newOffset] = 0; newOffset+=1;
+	DSDWORD[newOffset] = 0; newOffset+=4;
+	DSDWORD[newOffset] = 0; newOffset+=4;
+	DSDWORD[newOffset] = data;
 	offsetMemory += 17;
 	RETURN 0xFF;
 }
@@ -130,8 +135,10 @@
 	byte init(dword size);
 };
 
-:dword Dictionary::hash(dword text) // max 255 bytes as strings => 4 byte or duble word hash
+:dword Dictionary::hash(dword text)
 {
+	RETURN crc32(text, strlen(text));
+/*
 	dword checkSum1 = 1;
 	dword checkSum2 = 0;
 	dword beginAddress = 0;
@@ -148,6 +155,7 @@
 	EAX = text - beginAddress;
 	EAX <<= 23;
 	RETURN EAX | checkSum2;
+*/
 }
 
 :byte Dictionary::set(dword key, value)
@@ -165,4 +173,4 @@
 	RETURN array.init(size);
 }
 
-#endif
\ No newline at end of file
+#endif