Skip to content

Instantly share code, notes, and snippets.

@dotysan
Forked from KEINOS/md5.gs
Last active May 20, 2021 10:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dotysan/36b99217fdc958465b62f84f66903f07 to your computer and use it in GitHub Desktop.
Save dotysan/36b99217fdc958465b62f84f66903f07 to your computer and use it in GitHub Desktop.
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/dotysan/36b99217fdc958465b62f84f66903f07
* 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|Bytes[])} 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 );
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.toUpperCase()" if needed
return txtHash;
}
@Hash7ag
Copy link

Hash7ag commented Jul 20, 2020

Thanks for providing this useful code which helps me a lot, but there is no license.
Thus, I want to know if it's possible to add a license in the code.

@dotysan
Copy link
Author

dotysan commented Aug 13, 2020

Thanks for providing this useful code which helps me a lot, but there is no license.
Thus, I want to know if it's possible to add a license in the code.

See upstream.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment