Thursday 6 February 2014

How Salesforce 18 Digit Id Is Calculated

As we know that each record Id represents a unique record within an organization. There are two versions of every record Id in salesforce :
  • 15 digit case-sensitive version which is referenced in the UI
  • 18 digit case-insensitive version which is referenced through the API
The last 3 digits of the 18 digit Id is a checksum of the capitalization of the first 15 characters, this Id length was created as a workaround to legacy system which were not compatible with case-sensitive Ids. The API will accept the 15 digit Id as input but will always return the 18 digit Id.
Now how we can calculate the 18 digit Id from 15 digit Id ??? Just copy paste the below code in system logs and pass your 15 digit id in String id
//Your 15 Digit Id
String id= '00570000001ZwTi' ;

string suffix = '';
integer flags;

for (integer i = 0; i < 3; i++)
{
 flags = 0;
 for (integer j = 0; j < 5; j++)
 {
  string c = id.substring(i * 5 + j,i * 5 + j + 1);
  //Only add to flags if c is an uppercase letter:
  if (c.toUpperCase().equals(c) && c >= 'A' && c <= 'Z')
  {
   flags = flags + (1 << j);
  }
 }
 if (flags <= 25)
 {
  suffix = suffix + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.substring(flags,flags+1);
 }
 else
 {
  suffix = suffix + '012345'.substring(flags-25,flags-24);
 }
}

//18 Digit Id with checksum
System.debug(' ::::::: ' + id + suffix) ;
This debug will return the 18 digit Id.
 If you don’t mind using up a field per object….you can create a formula field to show the 18 digit ID as well.
Implementing 15-to-18-character ID converter through a formula field is below. No code needed! 
Id & 
MID( 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345", 
MIN(FIND(MID(Id, 5, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 16 + 
MIN(FIND(MID(Id, 4, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 8 + 
MIN(FIND(MID(Id, 3, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 4 + 
MIN(FIND(MID(Id, 2, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 2 + 
MIN(FIND(MID(Id, 1, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 1 + 1, 
1) & 
MID( 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345", 
MIN(FIND(MID(Id, 10, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 16 + 
MIN(FIND(MID(Id, 9, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 8 + 
MIN(FIND(MID(Id, 8, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 4 + 
MIN(FIND(MID(Id, 7, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 2 + 
MIN(FIND(MID(Id, 6, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 1 + 1, 
1) & 
MID( 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345", 
MIN(FIND(MID(Id, 15, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 16 + 
MIN(FIND(MID(Id, 14, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 8 + 
MIN(FIND(MID(Id, 13, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 4 + 
MIN(FIND(MID(Id, 12, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 2 + 
MIN(FIND(MID(Id, 11, 1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 1) * 1 + 1, 
1)

No comments:

Post a Comment