LlGenerateKey: Difference between revisions
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
{{ | {{LSL_Function | ||
|func=llGenerateKey | |func=llGenerateKey | ||
|func_desc=Generates a key using Type 3 (MD5) UUID generation to create a unique key using region-name, object-key, service and variable. | |func_desc=Generates a key using Type 3 (MD5) UUID generation to create a unique key using region-name, object-key, service and variable. | ||
| Line 116: | Line 116: | ||
{{LSLC|Examples}} | {{LSLC|Examples}} | ||
[[Category:LSL_Functions]] | |||
Revision as of 20:16, 5 April 2012
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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>