Difference between revisions of "LlGenerateKey"

From Second Life Wiki
Jump to navigation Jump to search
m (moved LlGenerateKey to LlGenerateKey2 over redirect)
m (moved LlGenerateKey2 to LlGenerateKey over redirect)
(No difference)

Revision as of 20:05, 5 April 2012

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>