Вот упрощенная версия ... Она в основном берет строку, вычисляет хеш MD5, извлекает первые четыре байта как длинную без знака (эффективное отображение строки в 4-байтовое число), преобразует ее в base36 и затем меняет местами из символов «о» и «ноль» для «X» и «Y». Затем он гарантирует, что конечная строка будет состоять только из шести символов, при необходимости добавляя символы Z.
require 'digest/md5'
# create an easy-to-read 6-digit unique idno
idno = original # starting string
idno = Digest::MD5.digest(idno).unpack("N").first # digest as unsigned long
idno = idno.to_s(36).upcase.tr("0O","XY") # convert to base34 (no "oh" or "zero")
idno = idno[0,6].ljust(6,"Z") # final 6-digit unique idno (pad with "Z" chars)