Difference between revisions of "Key compression"

From Second Life Wiki
Jump to navigation Jump to search
Line 1: Line 1:
'''Compress Keys of all sorts'''
'''Compress Keys of all sorts'''
This function set will both compress and decompress a key. I've seen size cut down by anywhere from 25 - 50%


<lsl>
<lsl>
string alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZqrstuvwxyz~!@#$%^&*()_+[]\{}|;':\",./<>?ÇüéâäàçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑ¿abcdefghijklmnop";
string strFullCompression = "0123456789abcdefghijklmnopqrstuvwxyz!\"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅ";
integer boundOffset = 107;
string compressKey(key id){
string compressKey(key id){
     string str = (string)llParseString2List((string)id,["-"],[]);
     string str = (string)llParseString2List((string)id,["-"],[]);
Line 12: Line 9:
     integer len = llStringLength(str);
     integer len = llStringLength(str);
     while(i < len){
     while(i < len){
         integer val = llSubStringIndex(alphanum,llToUpper(llGetSubString(str,i,i)));
         integer val = llSubStringIndex(strFullCompression,(llGetSubString(str,i,i)));
         ++i;     
         ++i;     
         integer val2 = llSubStringIndex(alphanum,llToUpper(llGetSubString(str,i,i)));
         integer val2 = llSubStringIndex(strFullCompression,(llGetSubString(str,i,i)));
         if(val <= 7 && val2 != 15){
         val *= 16;
            val *= 15;
        val += val2;
            val += val2;
         output += llGetSubString(strFullCompression,val,val);
            output += llGetSubString(alphanum,val,val);
         }else{
            output += llGetSubString(alphanum,boundOffset + val,boundOffset + val);
            val = llSubStringIndex(alphanum,llToUpper(llGetSubString(str,i,i)));
            output += llGetSubString(alphanum,boundOffset + val,boundOffset + val);
        }
         ++i;
         ++i;
     }
     }
Line 35: Line 26:
     string output;
     string output;
     while(i < len){
     while(i < len){
         integer indx = llSubStringIndex(alphanum,llGetSubString(compressed,i,i));
         integer indx = llSubStringIndex(strFullCompression,llGetSubString(compressed,i,i));
         if(indx >= boundOffset){
         integer val1 = (integer)indx / 16;
            output += llGetSubString(alphanum,indx - boundOffset,indx - boundOffset);   
        integer val2 = indx % 16;
        }else{
        output += llGetSubString(strFullCompression,val1,val1) + llGetSubString(strFullCompression,val2,val2);         
            integer val1 = (integer)indx / 15;
            integer val2 = indx % 15;
            output += llGetSubString(alphanum,val1,val1) + llGetSubString(alphanum,val2,val2);         
        }
         ++i;     
         ++i;     
     }
     }
Line 49: Line 36:
}
}
</lsl>
</lsl>
'''Example Output'''
Original Key: a80bba1c-bcc2-49a0-9142-6b1ffc4f0fb0
Compressed Key: kiBlkRlmmc.kajb}íbppmepapla
Compressed Key Length: 27
Decompressed Key: a80bba1c-bcc2-49a0-9142-6b1ffc4f0fb0
'''Example Output 2'''
Original Key: a2e76fcd-9360-4f6d-a924-000000000003
Compressed Key: kcohgpmnjdæepúkjY000003
Compressed Key Length: 23
Decompressed Key: a2e76fcd-9360-4f6d-a924-000000000003

Revision as of 17:46, 21 February 2008

Compress Keys of all sorts

<lsl> string strFullCompression = "0123456789abcdefghijklmnopqrstuvwxyz!\"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅ"; string compressKey(key id){

   string str = (string)llParseString2List((string)id,["-"],[]);
   integer i;
   string output;
   integer len = llStringLength(str);
   while(i < len){
       integer val = llSubStringIndex(strFullCompression,(llGetSubString(str,i,i)));
       ++i;    
       integer val2 = llSubStringIndex(strFullCompression,(llGetSubString(str,i,i)));
       val *= 16;
       val += val2;
       output += llGetSubString(strFullCompression,val,val);
       ++i;
   }
   
   return output;

}

string decompressKey(string compressed){

   integer i;
   integer len = llStringLength(compressed);
   string output;
   while(i < len){
       integer indx = llSubStringIndex(strFullCompression,llGetSubString(compressed,i,i));
       integer val1 = (integer)indx / 16;
       integer val2 = indx % 16;
       output += llGetSubString(strFullCompression,val1,val1) + llGetSubString(strFullCompression,val2,val2);        
       ++i;    
   }
   
   return llGetSubString(llInsertString(llInsertString(llInsertString(llInsertString(llInsertString(llToLower(output),12,""),8,"-"),13,"-"),18,"-"),23,"-"),0,35);

} </lsl>