In Salesforce CRM, every object has 15-character alphanumeric ID, which is case-sensitive. If anyone's curious, actually it's base-62 number. However, tools used for data migration and integration may or may not support case sensitivity. To overcome that, IDs can be safely converted to 18-character case-insensitive alphanumeric IDs. In that process 3-character alphanumeric checksum is appended to the ID. The conversion algorithm is:
Example:
a0RE000000IJmcN
Split ID into three 5-character chunks.
a0RE0 00000 IJmcN
Reverse each chunk.
0ER0a 00000 NcmJI
Replace each character in every chunk by
1
if it's uppercase or by0
if otherwise.01100 00000 10011
For each 5-digit binary number
i
, get character at positioni
in concatenation of uppercase alphabet and digits 0-5 (ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
).00000 -> A, 00001 -> B, 00010 -> C, ..., 11010 -> Z, 11011 -> 0, ..., 11111 -> 5`
Yielding:
M A T
Append these characters, the checksum, to the original ID.
Output:
a0RE000000IJmcNMAT
Write program or function which takes 15-character alphanumeric (ASCII) string as input and returns 18-character ID.
Input validation is out of scope of this question. Programs may return any value or crash on invalid input.
Please, don't use Salesforce propretiary languages' features that make this challenge trivial (such as formula CASESAFEID()
, converting Id
to String
in APEX &c).
Test Cases
a01M00000062mPg -> a01M00000062mPgIAI
001M000000qfPyS -> 001M000000qfPySIAU
a0FE000000D6r3F -> a0FE000000D6r3FMAR
0F9E000000092w2 -> 0F9E000000092w2KAA
aaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaAAA
AbCdEfGhIjKlMnO -> AbCdEfGhIjKlMnOVKV
aBcDEfgHIJKLMNO -> aBcDEfgHIJKLMNO025
public class X{public X(Id i){System.debug((String)i);}}
. Works only with valid Salesforce IDs, though. \$\endgroup\$