Difference between revisions of "LlGenerateKey"

From Second Life Wiki
Jump to navigation Jump to search
Line 66: Line 66:
= Optimisation =
= Optimisation =
Instead of always calling [[llGetRegionName|llGetRegionName()]], [[llGetKey|llGetKey()]], [[llGetLinkNumber|llGetLinkNumber()]], and [[llGetScriptName|llGetScriptName()]], you may wish to cache their return values into a <code>uri</code> variable, and only dynamically add the service and variable parameters each-time. Remember to update this variable when you know it's components will have changed, using the [[changed|changed()]], [[on_rez|on_rez()]], and/or [[attach|attach()]] events.
Instead of always calling [[llGetRegionName|llGetRegionName()]], [[llGetKey|llGetKey()]], [[llGetLinkNumber|llGetLinkNumber()]], and [[llGetScriptName|llGetScriptName()]], you may wish to cache their return values into a <code>uri</code> variable, and only dynamically add the service and variable parameters each-time. Remember to update this variable when you know it's components will have changed, using the [[changed|changed()]], [[on_rez|on_rez()]], and/or [[attach|attach()]] events.
Here is an example of the caching version of the function:
<lsl>string uri;
key generateKey(string service, string variable) {
    if (uri == "")
        uri =  "secondlife://" + llGetRegionName()  + "/" +
            (string)llGetKey() + "/" +
            (string)llGetLinkNumber() + "/" +
            llGetScriptName() + "/";
    return (key)llInsertString(
        llInsertString(
            llInsertString(
                llInsertString(
                    llMD5String(
                        uri + service + "/" + variable,
                        0 // This is reserved by specification, will
                          // be increased with new/different versions.
                    ),
                    8,
                    "-"
                ),
                13,
                "-"
            ),
            18,
            "-"
        ),
        23,
        "-"
    );
}
integer counter = 0;
default {
    state_entry() {
        llSetTimerEvent(10.0);
    }
    on_rez(integer x) { uri = ""; }
    attach(key id) { uri = ""; }
    changed(integer changes) {
        if (changes & (CHANGED_REGION | CHANGED_INVENTORY)) uri = "";
    }
    timer() {
        llOwnerSay("Random key of the moment is \"" + (string)generateKey("counter", (string)(counter++)) + "\"");
    }
}</lsl>


{{LSLC|Examples}}
{{LSLC|Examples}}

Revision as of 11:09, 18 October 2010

Summary

Function: key generateKey( string service, string variable );

Generates a key using Type 3 (MD5) UUID generation to create a unique key using region-name, object-key, service and variable.
Returns a key The generated key

• string service The service, object, function, or whatever else this key may represent.
• string variable Any variable(s) relevant to the service that uniquely distinguish it.

Examples

In a two-prim linked-set put the following script (adding generateKey where noted) into the child-prim:<lsl>integer requestID = 0;

// Add generateKey here!!

default {

   touch_start(integer x) {
       llMessageLinked(
           LINK_ROOT, 
           1234, 
           "I am a request", 
           generateKey("echo", (string)requestID++)
       );
   }
   link_message(integer x, integer y, string msg, key id) {
       if (y == 1234) 
           llOwnerSay("Request: " + (string)id + " = " + msg);
   }

}</lsl>And the following script in the root-prim:<lsl>default {

   link_message(integer x, integer y, string msg, key id) {
       if (y == 1234) // Echo, send straight back
           llMessageLinked(x, y, msg, id);
   }
}</lsl>Simply touch the child-prim to use, enjoy!

Implementation

<lsl>key generateKey(string service, string variable) {

   return (key)llInsertString(
       llInsertString(
           llInsertString(
               llInsertString(
                   llMD5String(
                       "secondlife://" + llGetRegionName()  + "/" + 
                           (string)llGetKey() + "/" + 
                           (string)llGetLinkNumber() + "/" + 
                           llGetScriptName() + "/" + 
                           service + "/" + variable, 
                       0 // This is reserved by specification, will 
                         // be increased with new/different versions.
                   ),
                   8,
                   "-"
               ),
               13,
               "-"
           ),
           18,
           "-"
       ),
       23,
       "-"
   );

}</lsl>

Optimisation

Instead of always calling llGetRegionName(), llGetKey(), llGetLinkNumber(), and llGetScriptName(), you may wish to cache their return values into a uri variable, and only dynamically add the service and variable parameters each-time. Remember to update this variable when you know it's components will have changed, using the changed(), on_rez(), and/or attach() events.

Here is an example of the caching version of the function: <lsl>string uri; key generateKey(string service, string variable) {

   if (uri == "") 
       uri =  "secondlife://" + llGetRegionName()  + "/" + 
           (string)llGetKey() + "/" + 
           (string)llGetLinkNumber() + "/" + 
           llGetScriptName() + "/";
   return (key)llInsertString(
       llInsertString(
           llInsertString(
               llInsertString(
                   llMD5String(
                       uri + service + "/" + variable, 
                       0 // This is reserved by specification, will 
                         // be increased with new/different versions.
                   ),
                   8,
                   "-"
               ),
               13,
               "-"
           ),
           18,
           "-"
       ),
       23,
       "-"
   );

}

integer counter = 0; default {

   state_entry() {
       llSetTimerEvent(10.0);
   }
   on_rez(integer x) { uri = ""; }
   attach(key id) { uri = ""; }
   changed(integer changes) {
       if (changes & (CHANGED_REGION | CHANGED_INVENTORY)) uri = "";
   }
    timer() {
       llOwnerSay("Random key of the moment is \"" + (string)generateKey("counter", (string)(counter++)) + "\"");
   }

}</lsl>