{"id":18841270,"url":"https://github.com/dmhendricks/hash-int","last_synced_at":"2026-01-30T09:30:17.750Z","repository":{"id":56970176,"uuid":"152289871","full_name":"dmhendricks/hash-int","owner":"dmhendricks","description":"A PHP class to generate an alphanumeric hash of specified length from an integer.","archived":false,"fork":false,"pushed_at":"2020-02-13T20:43:04.000Z","size":13,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-15T12:56:34.436Z","etag":null,"topics":["base62","hash","hash-functions","short-id","shorturl","tiny","url-shortener"],"latest_commit_sha":null,"homepage":"https://is.gd/qZyouq","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmhendricks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-09T17:06:37.000Z","updated_at":"2021-06-15T09:00:40.000Z","dependencies_parsed_at":"2022-08-21T10:50:44.675Z","dependency_job_id":null,"html_url":"https://github.com/dmhendricks/hash-int","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fhash-int","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fhash-int/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fhash-int/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fhash-int/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmhendricks","download_url":"https://codeload.github.com/dmhendricks/hash-int/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239780122,"owners_count":19695734,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["base62","hash","hash-functions","short-id","shorturl","tiny","url-shortener"],"created_at":"2024-11-08T02:50:34.986Z","updated_at":"2026-01-30T09:30:17.715Z","avatar_url":"https://github.com/dmhendricks.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Release](https://img.shields.io/github/release/dmhendricks/hash-int.svg?style=flat-square\u0026colorB=663399)](https://github.com/dmhendricks/hash-int/releases)\n[![GitHub License](https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square)](https://raw.githubusercontent.com/dmhendricks/hash-int/master/LICENSE)\n[![Downloads](https://img.shields.io/packagist/dt/dmhendricks/hash-int.svg?style=flat-square)](https://packagist.org/packages/dmhendricks/hash-int?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=button\u0026utm_campaign=dmhendricks%2Fhash-int)\n[![DigitalOcean](https://img.shields.io/badge/hosting-Digital%20Ocean-green.svg?style=flat-square\u0026label=hosting\u0026colorB=0152FF)](https://m.do.co/t/8a88362f5683?utm_source=github.com\u0026utm_medium=campaign\u0026utm_content=referral\u0026utm_campaign=dmhendricks%2Fhash-int)\n[![Twitter](https://img.shields.io/twitter/url/https/github.com/dmhendricks/hash-int.svg?style=social)](https://twitter.com/danielhendricks)\n[![BrowserStack](https://img.shields.io/static/v1?style=social\u0026label=BrowserStack\u0026message=Passed\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzQ5NjEyQzJDMzUxMTFFOTlBNkZDNEVGRUQ3QUI4RDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzQ5NjEyQzNDMzUxMTFFOTlBNkZDNEVGRUQ3QUI4RDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NDk2MTJDMEMzNTExMUU5OUE2RkM0RUZFRDdBQjhEOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NDk2MTJDMUMzNTExMUU5OUE2RkM0RUZFRDdBQjhEOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhdfVWUAAAGAUExURXjIMP/Rhf/Xn4mHhwpRXnrY8CIXFv41Sk68OACv2QC+6svIAP5oEAC+6H7ToKa3nP9fF//AT/+tfPjVzpTPHf+6Rf1GLcbVAJDd8P/9+v/qyf/EY/+mNXHLidKyF126Mv/26anm8/+8TP/68P1jAFHO8lPAYu+SDqrh7v+xR/0eOgC/rIGvM7SvI9qKjAC+6lG5wf+SM/+2mOGnGf8NMgCcvLLEw5OZOv0yMfvARRfD7v+VSf9lZ/9mOqTs9lvAQ/+EK/+VY7Hr/f+cN0+7Lb2FMuqFG7tuOv9jEOCLLP93JKzj+ZDYwwC9s2LLrQB8k/9wEv+4R/9oD5/g1b3iAACtygCJo//w6MnHyPM5M+h3NuVyfcLPZP9MWKOYXMevu/+Xn5HG06nWAwDG8pzn6//lsZ/l85rik/+def/38fNoILPS3/1tF/+3Zf+sROmuICWPq3edprrG0VTW26jn/EhteD7CN9ibbgC8t/96NPmLQIjPY/9CKSQfIP///////+tAimMAAACAdFJOU/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AOAVLZwAAAj9JREFUeNpU0vtb0lAYB/CzCTgeDrQpGwyUyzZwwwyBmTRNELwgkYpQZkUXumktyrJ13eFf9z0CZd8ftufZZ9/znPOcFw1HIWezp+u9Xm/9xaw8nASNXsczfNk0c2VJOjGni2fXkRQ1KWeWdxKBSCSS2DuZZslflDepPX76LrS/P/+7343slWfkMRJque+djGXlIcuo301IH+URFjU+Z97ayAAEIfl8NtxN3GUIxWMNS+aTDS/QysHBij8YXOTC3b21N4DkFIrTH95alt/j+nw+z0owmE32A78UdYhS2JZg0aiV9/hc1zc1C7q4hbolgx0ilgd8vuG1HoK5rkxcT/B+kusHDEFGm5ot5b6kvZbnCh9Nua7/R5ILR9piDP3EVxgdowtPPzRR5I7IIpvi7bSeGSPEvzhCBjUp3rjQo5/H6PO8mt8CbCtxuixvPnut695J1f+1wnHhgAG4pmG7vBu6p6ej367O+cALRa7/SQQsahjzJ8kWaPrl+fmy9yIEVgnUBdhQ7BBj+8+uE9KBa7WaTntcf2EgwFHkAlSxtOpkQ61OpxWqUAuXqoKiyIgwUMVHoFtcpcJRclAJG7AqQUN1DlPlt5OO44A4laUFvi4oYgqujLB1qrjxfnv1JmRp54gvgMGowGXL8blDnpYbDfpPg7dpLy6PZkgVjCrW8Cg8rhpggjqZPjUuGoWmDWQ3CwOB9tR/cyuzoqC0B4OBoVASWfn6UJMUo4gAVBQmRf6beGA1xsQVJc7EVDL5dinAAO2UucfjcPEkAAAAAElFTkSuQmCC)](https://browserstack.com/?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=link\u0026utm_campaign=dmhendricks%2Fhash-int)\n\n# Hash Integer\n\nA PHP class to generate an alphanumeric hash of specified length from an integer.\n\n```\ncomposer require dmhendricks/hash-int\n```\n\n### Requirements\n\n- PHP 5.6 or higher\n- [BC Math](https://www.php.net/manual/en/book.bc.php): `apt install php7.x-bcmath`\n\n### Usage\n\n```php\n$num = 456;\n\n/**\n * Create a 7-character hash from integer\n */\n$hash = \\CloudVerve\\HashInt::hash( $num, 7 );\n\n// Unhash the string\n$unhashed = \\CloudVerve\\HashInt::unhash( $hash );\n\necho 'Hashed: ' . $hash . '\u003cbr /\u003e';\necho 'Unhashed: ' . $unhashed;\n```\n\n### Result\n\n```\nHashed: p3Wq1aC\nUnhashed: 456\n```\n\n## Original [Author](https://github.com/KevBurnsJr) Notes\n\nParaphrased ([source](http://web.archive.org/web/20130727034425/http://blog.kevburnsjr.com/php-unique-hash)):\n\n\u003e I wanted a short, unique, alphanumeric hash with a sequence that is difficult to deduce. I could create it with md5 and trim the first _n_ chars, but storing a truncated checksum in a unique field means that the frequency of collisions will increase geometrically as the number of unique keys for a base 62-encoded integer approaches 62^n. I'd rather do it right than create a time bomb.\n\n\n### Base 62\nHashes are base 62 encoded base 10 integers. 1=1, 10=a, 36=Z, 61=z, 62=10, 72=1a, etc.\n\n### 62, 3844, 238328, 14776336, 916132832, 56800235584, 3521614606208\n1 character = 62 permutations, 2 characters = 3844 permutations, etc.\n\n### 41, 2377, 147299, 9132313, 566201239, 35104476161, 2176477521929\n41 = next highest prime from golden mean of 62.\n\n2377 = next highest prime from golden mean of 3844.\n\n### Uniqueness\n\u003e I chose to use primes to ensure hash uniqueness. Any prime greater than one half 62^n will do, but if you use a prime near 62^n or 62^n/2 or 2*62^n/3 etc, you will detect a linearity in the sequence at certain points in the ring.\n\n### Appearance of Randomness\n\u003e I chose primes near the golden ratio to maximize the appearance of randomness. Given a small set of hashes (even with the associated id) it would be difficult for anyone to guess the next hash.\n\n### :warning: Minimum-Security Technique\nThis is a thin rotation and base re-encoding obfuscation algorithm, not an encryption algorithm. Don't use this to encrypt sensitive information - use it to obfuscate integer IDs or create short reference keys (as an example, for short URLs).\n\n### Special Thanks\n- [Prime Numbers Generator and Checker](https://www.numberempire.com/primenumbers.php?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=link\u0026utm_campaign=dmhendricks%2Fhash-int)\n- [Ernesto Preste](https://www.linkedin.com/in/ernesto-preste-4377912b/) for adding [bcmath support](http://web.archive.org/web/20130727034425/http://blog.kevburnsjr.com/php-unique-hash#comment-2792)\n- [Padraig Kennedy](https://twitter.com/Padraig) for adding [hash reversibility](http://web.archive.org/web/20130727034425/http://blog.kevburnsjr.com/php-unique-hash#comment-2805)\n\n[![Analytics](https://ga-beacon.appspot.com/UA-126205765-1/dmhendricks/hash-int?flat)](https://ga-beacon.appspot.com/?utm_source=github.com\u0026utm_medium=campaign\u0026utm_content=button\u0026utm_campaign=dmhendricks%2Fhash-int)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmhendricks%2Fhash-int","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmhendricks%2Fhash-int","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmhendricks%2Fhash-int/lists"}