Every docs URL answers with Markdown when you add .md. Site map: llms.txt
Hash Calculator
Turn RDR2 names into joaat hashes one at a time or as a list, and look a hash up against the names and game text read from RDR2's own files.
The Hash Calculator turns a name into the 32 bit joaat hash RDR2 uses for it, shows that hash as unsigned, signed and hex, and goes the other way too: paste a hash and it tells you which RDR2 name or game text label it belongs to, when it knows one.
What it is for
RedM natives take model names, weapons, controls, scenarios and blip styles as hashes, and dumps and logs print them in whatever form they like. 3369743360, -925223936 and 0xC8DA3400 are the same horse. This page gives you every form of a hash at once, a table of hashes for a whole list of names, and a way to put a name back on a number you found in someone else’s script.
RDR2 uses the same joaat as GTA V, hashed on the lower case name. In RedM that is GetHashKey(name), joaat(name) or the Lua backtick shorthand `name`. What differs between the two games is which names exist, so the reverse lookup here searches RDR2 names, not GTA V ones.
Quick start
- Pick a tab: Single, Bulk or Reverse lookup.
- In Single, type a name in String. The Result panel shows Unsigned, Signed (int32), Hex and Lua backtick. Click any value to copy it.
- In Bulk, paste one name per line. The table lists each name with its signed and hex hash, and the code block under it is a ready Lua table.
- In Reverse lookup, paste a hash or a name into Look up and read the matches.
Single
Type any string. It is hashed lower cased, exactly like GetHashKey, so A_C_HORSE_ARABIAN_WHITE and a_c_horse_arabian_white give the same result. The page opens on a_c_horse_arabian_white:
| Row | Value |
|---|---|
| Unsigned | 3369743360 |
| Signed (int32) | -925223936 |
| Hex | 0xC8DA3400 |
| Lua backtick | `a_c_horse_arabian_white` |
The Lua backtick row is the name lower cased between backticks. RedM’s Lua turns that into the hash when the script loads, so you never have to paste the number into code.
Bulk
One string per line, blank lines are ignored. The panel title counts the hashes, the table shows Name, Signed and Hex, and Export format (Hex, Signed or Unsigned) decides what the generated table holds. The default sample and the default (hex) output:
local Hashes = {
a_c_horse_arabian_white = 0xC8DA3400,
WEAPON_REVOLVER_CATTLEMAN = 0x169F59F7,
mp_male = 0xF5C1611E,
INPUT_JUMP = 0xD9D0E1C0,
WORLD_HUMAN_SMOKE = 0xFEA62BA1,
}The keys keep the case you typed. Only the hash is computed from the lower case name.
Reverse lookup
Paste up to 25 values, one per line (commas work too). Each value can be:
- an unsigned number (
3369743360), - a signed number (
-925223936), 0xhex (0xC8DA3400),- or a name (
mp_male), which is hashed first and then looked up, so you can check whether a name you have is one the game knows.
Every value gets its own panel. It says whether it was Read as a hash or Read as a name, shows the three forms of the hash, and lists every match with what kind of thing it is and an Open button that takes you to it on the RedM assets page or in the Game Text Search.
The names searched are read from RDR2’s own files. Today that is 28,747 names in 17 sets:
| Set | Names |
|---|---|
| Item | 13,085 |
| Map file (imap) | 5,124 |
| Scenario | 2,666 |
| Ped model | 1,982 |
| Game script | 1,889 |
| Timecycle modifier | 1,286 |
| Blip texture | 628 |
| Blip style | 620 |
| Document texture | 378 |
| Control (input) | 373 |
| Interior (MLO) | 278 |
| Weapon | 137 |
| Vehicle model | 115 |
| Map zone | 87 |
| Ammo type | 69 |
| Weather type | 22 |
| Prompt hold mode | 8 |
On top of those, a hash is checked against all 259,297 labels of the game’s English text. A label hit is listed as Game text label with the text itself, for example 0x0000F96B comes back as “Jumping Jeremiah!”.
Note
“No match” is common in RDR2 and does not mean your value is wrong. The game stores most of its names only as hashes, so plenty of real hashes have no known name at all. A model or item added by a custom resource will never be in this list either.
Signed or unsigned
A joaat hash is an unsigned 32 bit number, but RedM natives and most dumps print it as a signed int32. Anything over 2147483647 comes out negative when printed signed. Both are the same hash: pass whichever your code or the native expects.
Tips
- Use the Lua backtick form in Lua scripts. It is readable, it cannot be mistyped as a number, and it is hashed for you.
- When you find a bare number in an old script, paste it into Reverse lookup before guessing. If it is a label hash, the Open button shows you the full text.
- Bulk with Signed is handy when a config file or database column stores hashes as signed integers.
Common mistakes
- Hashing the display name.
"Arabian"is not a model name. Hash the model, weapon or control name the game uses (a_c_horse_arabian_white,WEAPON_REVOLVER_CATTLEMAN,INPUT_JUMP). - Comparing signed with unsigned.
-925223936 == 3369743360is false in code even though they are the same hash. Convert one side before comparing. - Taking a collision for an answer. joaat is 32 bit, so two different names can share a value. When more than one name comes back, pick the one that fits what you are doing.
Limitations
- The lookup only knows names that appear in RDR2’s own files and that someone could put a name to. Many RDR2 hashes have no known name.
- It covers the sets listed above and the English game text. Anything else (sounds, animations, props) is not searched yet.
- When the same name is in two sets, or a name is also a text label key (
INPUT_JUMPis a control and the label of the word “Jump”), the panel counts two matches and shows the collision note even though only one name is involved.