Skip to content

Instantly share code, notes, and snippets.

@KEINOS KEINOS/md5.gs
Last active Aug 22, 2019

Embed
What would you like to do?
GAS(Google Apps Script) user function to get MD5 hash or 4digit shortened hash for Multibyte(UTF-8, 2bytes character) environment.
/**
* ------------------------------------------
* MD5 function for GAS(GoogleAppsScript)
*
* You can get a MD5 hash value and even a 4digit short Hash value of a string.
* ------------------------------------------
* Usage1:
* `=MD5("YourStringToHash")`
* or
* `=MD5( A1 )` with the same string at A1 cell
* result:
* `FCE7453B7462D9DE0C56AFCCFB756193`.
* For your sure-ness you can verify it in your terminal as below.
* `$ md5 -s "YourStringToHash"`
* Usage2:
* `=MD5("YourStringToHash", true)` for short Hash
* result:
* `6MQH`
* Note that it has more conflict probability.
*
* How to install:
* Copy the scipt, pase it at [Tools]-[Script Editor]-[<YourProject>]
* or go https://script.google.com and paste it.
* For more details go:
* https://developers.google.com/apps-script/articles/
* Latest version:
* https://gist.github.com/KEINOS/78cc23f37e55e848905fc4224483763d
* Author:
* KEINOS @ https://github.com/keinos
* Reference and thanks to:
* https://stackoverflow.com/questions/7994410/hash-of-a-cell-text-in-google-spreadsheet
* ------------------------------------------
*
* @param {string} input The value to hash.
* @param {boolean} isShortMode Set true for 4 digit shortend hash, else returns usual MD5 hash.
* @return {string} The hashed input
* @customfunction
*
*/
function MD5( input, isShortMode )
{
var txtHash = '';
var rawHash = Utilities.computeDigest(
Utilities.DigestAlgorithm.MD5,
input,
Utilities.Charset.UTF_8 );
var isShortMode = ( isShortMode == true ) ? true : false;
if ( ! isShortMode ) {
for ( i = 0; i < rawHash.length; i++ ) {
var hashVal = rawHash[i];
if ( hashVal < 0 ) {
hashVal += 256;
};
if ( hashVal.toString( 16 ).length == 1 ) {
txtHash += '0';
};
txtHash += hashVal.toString( 16 );
};
} else {
for ( j = 0; j < 16; j += 8 ) {
hashVal = ( rawHash[j] + rawHash[j+1] + rawHash[j+2] + rawHash[j+3] )
^ ( rawHash[j+4] + rawHash[j+5] + rawHash[j+6] + rawHash[j+7] );
if ( hashVal < 0 ) {
hashVal += 1024;
};
if ( hashVal.toString( 36 ).length == 1 ) {
txtHash += "0";
};
txtHash += hashVal.toString( 36 );
};
};
// change below to "txtHash.toLowerCase()" for lower case result.
return txtHash.toUpperCase();
}
@schoraria911

This comment has been minimized.

Copy link

commented Aug 22, 2019

This is brilliant! Thanks a ton :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.