llGenerateKey

From Second Life Wiki
Revision as of 21:04, 5 April 2012 by Lomoco Binder (talk | contribs) (moved LlGenerateKey to LlGenerateKey2 over redirect)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Summary

Function: key llGenerateKey( 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>