Difference between revisions of "LlHash"

From Second Life Wiki
Jump to navigation Jump to search
(Created page with "{{LSL Function |func_sleep=0.0|func_energy=10.0 |func=llHash|sort=Hash |func_desc=Returns a 32bit hash for the provided string. |return_type=integer |p1_type=string|p1_name=va...")
 
Line 46: Line 46:
32 bits the chance of a collision is unacceptably high.(with 1000 entries, the odds for a collision are about 1 in 10000.)
32 bits the chance of a collision is unacceptably high.(with 1000 entries, the odds for a collision are about 1 in 10000.)
|examples=
|examples=
Given the combination of the object name and the owner's key generate a unique number.  This number could be used for things
like selecting a chat channel that has a low probability of colliding with another object.
<source lang="lsl2">
integer pickIDForObject()
{
    /* Generate an arbitrary integer ID for the combination of the
    * object name and the ower's key.  This value could be used
    * for selecting a chat/listen channel.
    */
    string obj_name = llGetObjectName();
    key obj_owner = llGetOwner();
   
    integer hash = llHash(obj_name + (string)obj_owner);
   
    return hash;
}
</source>
|helpers|related
|helpers|related
|also_functions=
|also_functions=

Revision as of 14:53, 5 May 2021

Summary

Function: integer llHash( string val );

Returns a 32bit hash for the provided string.
Returns an integer

• string val String to hash.

Specification

The SDBM algorithm provides a good general purpose hash function with a fairly even distribution across the 32 bit space in the general case. The characters fed into the hash function are 32bit wide.

U32 SDBMHash(const std::wstring &val)
{
    U32 hash(0);

    for(const wchar_t &c: val)
    {
        hash = c + (hash << 6) + (hash << 16) - hash;
    }
    return hash;
}

In LSL:

integer llSDBMHash(string value)
{
    integer hash = 0;
    integer index = 0;
    for (index = 0; index < llStringLength(value); ++index)
    {
        hash = llOrd(value, index) + (hash << 6) + (hash << 16) - hash;
    }
    
    return hash;
}

Caveats

This hash value is not cryptographically secure and should not be used as part of any security protocol. SDBM provides a good distribution of hash values across its range, however with only 32 bits the chance of a collision is unacceptably high.(with 1000 entries, the odds for a collision are about 1 in 10000.)

All Issues ~ Search JIRA for related Bugs

Examples

Given the combination of the object name and the owner's key generate a unique number. This number could be used for things like selecting a chat channel that has a low probability of colliding with another object.

integer pickIDForObject()
{
    /* Generate an arbitrary integer ID for the combination of the
     * object name and the ower's key.  This value could be used 
     * for selecting a chat/listen channel. 
     */
    string obj_name = llGetObjectName();
    key obj_owner = llGetOwner();
    
    integer hash = llHash(obj_name + (string)obj_owner);
    
    return hash;
}

See Also

Functions

• llOrd Convert a character into an ordinal
• llChar Convert an ordinal into a character

Articles

•  "Wikipedia logo"List of Hash Functions
•  Hash Collision Probabilities

Deep Notes

Search JIRA for related Issues

Signature

function integer llHash( string val );