This repository has been archived by the owner on Jul 27, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathindex.html
34 lines (23 loc) · 30.5 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html><html lang="en"><head><title>Hashids - generate short unique ids from integers</title><meta name="keywords" content="hashids, hashid, hash, id, short hash, youtube hash, bitly hash"><meta name="description" content="Generate short unique ids from integers. Use in url shortening or as unique ids."><meta name="author" content="Bazyli Brzóska"><meta name="robots" content="noarchive"><meta name="twitter:title" content="Hashids"><meta name="twitter:creator" content=""><meta name="twitter:description" content="Generate short obfuscated strings from integers. Use in url shorteners or as unique ids."><meta name="twitter:card" content="summary"><meta name="twitter:image:src" content="https://hashids.org/public/img/hashids.250x250.png"><meta name="twitter:domain" content="hashids.org"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1,width=device-width"><meta name="apple-mobile-web-app-capable" content="yes"><meta property="og:title" content="Hashids"><meta property="og:site_name" content="Hashids"><meta property="og:type" content="website"><meta property="og:url" content="https://hashids.org/"><meta property="og:image" content="https://hashids.org/public/img/hashids-screenshot.png"><link rel="icon" type="image/png" href="/public/img/favicon.16.png"><link href="/public/css/lib/app-1.1.0.min.css" rel="stylesheet" type="text/css" media="screen"><link href="https://fonts.googleapis.com/css?family=Fira+Mono:400,700|Leckerli+One" rel="stylesheet" type="text/css" media="screen"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.1/styles/default.min.css"><link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"></head><body spellcheck="false" class="lang-javascript"><div class="wrap"><div class="wrap-inner"><section class="header"><h2><a href="/" class="no-effect">hashids</a></h2><div><p class="description">Generate short unique ids from integers</p><hr><p class="available">available in <a class="javascript" href="/javascript">JavaScript</a>, <a class="ruby" href="/ruby">Ruby</a>, <a class="python" href="/python">Python</a>, <a class="java" href="/java">Java</a>, <a class="scala" href="/scala">Scala</a>, <a class="php" href="/php">PHP</a>, <a class="perl" href="/perl">Perl</a>, <a class="perl6" href="/perl6">Perl 6</a>, <a class="swift" href="/swift">Swift</a>, <a class="clojure" href="/clojure">Clojure</a>, <a class="objective-c" href="/objective-c">Objective-C</a>, <a class="c" href="/c">C</a>, <a class="cpp" href="/cpp">C++11</a>, <a class="d" href="/d">D</a>, <a class="f-sharp" href="/f-sharp">F#</a>, <a class="go" href="/go">Go</a>, <a class="erlang" href="/erlang">Erlang</a>, <a class="lua" href="/lua">Lua</a>, <a class="haskell" href="/haskell">Haskell</a>, <a class="ocaml" href="/ocaml">OCaml</a>, <a class="elixir" href="/elixir">Elixir</a>, <a class="rust" href="/rust">Rust</a>, <a class="smalltalk" href="/smalltalk">Smalltalk</a>, <a class="coldfusion" href="/coldfusion">ColdFusion</a>, <a class="kotlin" href="/kotlin">Kotlin</a>, <a class="nim" href="/nim">Nim</a>, <a class="vba" href="/vba">VBA</a>, <a class="haxe" href="/haxe">Haxe</a>, <a class="crystal" href="/crystal">Crystal</a>, <a class="elm" href="/elm">Elm</a>, <a class="actionscript" href="/actionscript">ActionScript</a>, <a class="bash" href="/bash">Bash</a>, <a class="r" href="/r">R</a>, <a class="tsql" href="/tsql">TSQL</a>, <a class="postgresql" href="/postgresql">PostgreSQL</a>, <a class="plpgsql" href="/plpgsql">PLpgSQL</a>, <a class="dart" href="/dart">Dart</a>, <a class="io" href="/io">Io</a>, <a class="julia" href="/julia">Julia</a> and for <a class="net" href="/net">.NET</a></p></div></section><section id="uses"><div><div><p>Hashids is a <a target="_blank" href="https://github.com/niieani/hashids.js">small open-source library</a> that generates short, unique, non-sequential ids from numbers.</p><p>It converts numbers like 347 into strings like “yr8”, or array of numbers like [27, 986] into “3kTMd”.</p><p>You can also decode those ids back. This is useful in bundling several parameters into one or simply using them as short UIDs.</p><p class="demo-button"><a target="_blank" href="https://codepen.io/anon/pen/vqGmBX" class="button button-grey no-effect"><i class="fa fa-codepen"></i> check out the demo</a></p><p class="add-your-project">Are you also using Hashids? <a target="_blank" href="https://github.com/hashids/hashids.github.io/wiki/Who's-Using-Hashids">Add your project</a>.</p></div><div class="in-use"><ul class="slides"><li><a target="_blank" href="https://codepen.io/" class="no-effect"><img src="/public/img/screenshot-codepen.png" alt="Codepen"></a></li><li><a target="_blank" href="https://www.bemyeyes.com/" class="no-effect"><img src="/public/img/screenshot-bemyeyes.png" alt="Be My Eyes"></a></li><li><a target="_blank" href="https://pathbrite.com/" class="no-effect"><img src="/public/img/screenshot-pathbrite.png" alt="Pathbrite"></a></li><li><a target="_blank" href="https://zenlocator.com/" class="no-effect"><img src="/public/img/screenshot-zenlocator.png" alt="ZenLocator"></a></li><li><a target="_blank" href="https://paste.laravel.io/" class="no-effect"><img src="/public/img/screenshot-laravelio.png" alt="Laravel bin"></a></li><li><a target="_blank" href="http://htmlmuncher.com/" class="no-effect"><img src="/public/img/screenshot-htmlmuncher.png" alt="HTML Muncher"></a></li><li><a target="_blank" href="http://digestif.me/" class="no-effect"><img src="/public/img/screenshot-digestif.png" alt="Digestif"></a></li><li><a target="_blank" href="https://laravel.fr/" class="no-effect"><img src="/public/img/screenshot-laravelfr.png" alt="Laravel.fr"></a></li><li><a target="_blank" href="http://jiecao.fm/" class="no-effect"><img src="/public/img/screenshot-jiecao.png" alt="Jiecao.fm"></a></li></ul></div></div></section><section id="repo"><h2>JavaScript version</h2><div><div class="float"><pre class="inline"><code>var hashids = new Hashids("this is my salt"),
id = hashids.encode(1, 2, 3),
numbers = hashids.decode(id);</code></pre><div class="buttons"><a target="_blank" href="https://github.com/niieani/hashids.js" class="button button-grey no-effect"><i class="fa fa-github-square"></i> github repo</a><br><a href="https://github.com/niieani/hashids.js" class="button button-blue no-effect"><i class="fa fa-cloud-download"></i> download</a></div></div><div><p>Implemented by <a target="_blank" href="https://github.com/niieani">Bazyli Brzóska</a> — <a target="_blank" href="https://github.com/niieani/hashids.js">https://github.com/niieani/hashids.js</a><br>Also check out:</p><ul class="taglets"><li><a target="_blank" href="https://www.npmjs.com/package/hashids">NPM package</a></li><li><a target="_blank" href="http://bower.io/search/?q=hashids">Bower package</a></li></ul></div></div></section><section id="features"><h2>Features</h2><div><ol><li>Create short unique ids from numbers (positive numbers & zero).</li><li>Allow custom alphabet as well as salt — so ids are unique only to you.</li><li>Incremental input is mangled to stay unguessable.</li><li>Code is tiny (~350 lines), fast and does not depend on external libraries.</li></ol></div></section><section id="how-does-it-work"><h2>How does it work?</h2><div><p>Hashids works similarly to the way integers are converted to hex, but with a few exceptions:</p><ol><li>The alphabet is not base16, but base base62 by default.</li><li>The alphabet is also shuffled based on salt.</li></ol><p>This JavaScript function shows regular conversion of integers to hex. It's part of Hashids (although this is a modified example):</p><pre><span>JavaScript</span><code class="javascript">function toHex(input) {
var hash = "",
alphabet = "0123456789abcdef",
alphabetLength = alphabet.length;
do {
hash = alphabet[input % alphabetLength] + hash;
input = parseInt(input / alphabetLength, 10);
} while (input);
return hash;
}</code></pre><div class="read-more"><button data-target="how-it-works-more">read more</button></div><div class="how-it-works-more hidden"><p>If we try to convert integer 1234 to hex with <code class="inline">toHex(1234)</code>, we will get back "4d2".</p><p>If we increase the alphabet to <code class="inline">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890</code>, our output will now be shorter because there's more characters to work with — so it becomes "t5".</p><p>If we take it one step further and shuffle the alphabet before encoding, we will get a different value. But how could we shuffle the alphabet consistently, so that with every shuffle the characters would keep the same order?</p><p>That's where Hashids uses a variation of <a target="_blank" href="https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle">Fisher-Yates algorithm</a>:</p><pre><span>JavaScript</span><code class="javascript">function consistentShuffle(alphabet, salt) {
var integer, j, temp, i, v, p;
for (i = alphabet.length - 1, v = 0, p = 0; i > 0; i--, v++) {
v %= salt.length;
p += integer = salt[v].charCodeAt(0);
j = (integer + v + p) % i;
temp = alphabet[j];
alphabet = alphabet.substr(0, j) + alphabet[i] + alphabet.substr(j + 1);
alphabet = alphabet.substr(0, i) + temp + alphabet.substr(i + 1);
}
return alphabet;
}</code></pre><p>The code above might look complicated, but it does one simple thing — shuffles the alphabet based on user's salt.</p><p>That way when one user passes the salt "abc1", our alphabet becomes <code class="inline">cUpI6isqCa0brWZnJA8wNTzDHEtLXOYgh5fQm2uRj4deM91oB7FkSGKxvyVP3l</code></p><p>And when another user passes "abc2", the alphabet becomes <code class="inline">tRvkhHx0ZefcF46YuaAqGLDKgM1W5Vp2T8n9s7BSoCjiQOdrEbJmUINywzXP3l</code></p><p>You can see that the shuffle is pretty good even when salt value is not that much different. This is what makes the base of Hashids work. Now we are able to encode one integer based on the salt value the user provides.</p><p>But Hashids is able to encode several integers into one id. This is done by reserving a few characters from the alphabet as <i>separators</i>. These characters are not used in encoding, but instead do the job of purely separating the real encoded values.</p><p>Let's say we encoded <em>1, 2, 3</em> without the salt and got "o2fXhV". Actual values in this output are highlighted: <em class="highlight">o<span>2</span>f<span>X</span>h<span>V</span></em>. Letters "f" and "h" are simply used as separators.</p><p>Letter "o" in this case is reserved for another type of job - it acts as a <i>lottery</i> character to randomize incremental input. If we encode numbers as we increment them, the output is somewhat predictable:</p><table><thead><tr><td>Input</td><td>Output</td></tr></thead><tbody><tr><td>1, 2, 3</td><td>2fXhV</td></tr><tr><td>1, 2, 4</td><td>2fXhd</td></tr><tr><td>1, 2, 5</td><td>2fXh6</td></tr><tr><td>1, 2, 6</td><td>2fXhz</td></tr><tr><td>1, 2, 7</td><td>2fXhR</td></tr></tbody></table><p>So the lottery character is used to do another iteration of consistent shuffle, before starting the actual encoding. The ids then end up looking more random (with a tiny disadvantage of having that extra lottery character):</p><table><thead><tr><td>Input</td><td>Output</td></tr></thead><tbody><tr><td>1, 2, 3</td><td>o2fXhV</td></tr><tr><td>1, 2, 4</td><td>pYfzhG</td></tr><tr><td>1, 2, 5</td><td>qxfOhN</td></tr><tr><td>1, 2, 6</td><td>rkfAhN</td></tr><tr><td>1, 2, 7</td><td>v2fWhy</td></tr></tbody></table><p>This is a quick overview of how Hashids is structured. Decoding is done the same way but in reverse — of course in order for that to work, Hashids itself needs the salt value from you in order to decode ids correctly.</p><p>If you give Hashids the wrong salt and it just so happens that it decodes back to some random integers, Hashids does a quick check by encoding those integers to be sure the initial id matches. If it does not, the integers are discarded.</p></div></div></section><section id="cursing"><h2>#%@&$!!11</h2><div><div class="octocat-split octocat-split-left"><div><a target="_blank" href="https://octodex.github.com/" class="no-effect"><img src="/public/img/bouncercat.png" alt=""></a><span class="subtext">bouncercat awesomed by <a target="_blank" href="https://github.com/cameronmcefee">cameronmcefee</a></span></div><div><p>We need ids to be nice and friendly especially if they end up being in the URL.</p><p>Therefore, the algorithm tries to avoid generating most common English curse words by never placing the following letters (and their uppercase equivalents) next to each other:</p><p><code class="inline">c, s, f, h, u, i, t</code></p><p>This is done by using them as <a href="#how-does-it-work">separators</a>.</p></div></div></div></section><section id="alternatives"><h2>Are there any alternatives?</h2><div><p>Yes, there are a few and you should pick the most appropriate for the job. Hashids is not perfect for everything.</p><ol><li><em>Base64 encode</em>. This is the most straightforward approach — most languages have these functions. If you don't need all the fancy extras Hashids has to offer, this method will work just fine. It'll probably be faster too. <a target="_blank" href="https://en.wikipedia.org/wiki/Base64">Read more</a>.</li><li><em>Generate ids based on timestamp</em>. If you can afford certain degree of collisions, you could compose an id that's built on the fly. Use a counter (if you have one) + timestamp (even better if in milliseconds) + some system value (either an IP address or some machine id) + a random integer. Many big companies implement this approach because it works well in distributed systems. These ids are generated independently of each other and the risk of collisions is <a target="_blank" href="https://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates">so tiny</a> it's negligible.</li><li><em>If you need your ids to consist of only numbers</em>, check out Optimus. It's based on Knuth's integer hash method and produces obfuscated integer ids (and does it faster too). There are <a target="_blank" href="https://github.com/jenssegers/optimus">PHP</a> and <a target="_blank" href="https://github.com/pjebs/optimus-go">Go</a> implementations.</li><li><em>Nano ID</em>. Check out <a target="_blank" href="https://github.com/ai/nanoid">Nano ID</a>, it's available for several languages as well.</li><li><em>Check out how others do it:</em><p>- <a target="_blank" href="https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c">How does Instagram generate ids?</a></p></li></ol></div></section><section id="what-not-to-do"><h2>What not to do</h2><div><ol><li><em>Do not try to encode negative numbers</em>. It won't work. The library currently supports only positive numbers and zero. If you're trying to use numbers as flags for something, simply designate the first <i>N</i> number of digits as internal flags.</li><li><em>Do not encode strings</em>. We've had several requests to add this feature — "it seems so easy to add". We will not add this feature for security purposes, doing so encourages people to encode sensitive data, like passwords. This is the wrong tool for that.</li><li><em>Do not encode sensitive data</em>. This includes sensitive integers, like numeric passwords or PIN numbers. This is <i>not a true encryption algorithm</i>. There are people that dedicate their lives to cryptography and there are plenty of more appropriate algorithms: <a target="_blank" href="https://en.wikipedia.org/wiki/Bcrypt">bcrypt</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/MD5">md5</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">aes</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/SHA-1">sha1</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/Blowfish_(cipher)">blowfish</a>. Here's <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_algorithms#Cryptography">a full list</a>.</li></ol></div></section><section id="collisions"><h2>Collisions</h2><div><p>There are no collisions because the method is based on integer to hex conversion. As long as you don't change constructor arguments midway, the generated output will stay unique to your salt.</p><p>Additionally, we encourage you to pre-generate a large number of ids for testing purposes — to analyze their uniqueness, whether they look random enough for your project and what your upper integer limit is (which usually depends on your system/language).</p><p>Please note that generated ids are <i>case-sensitive</i> by default ("Aaa" is not the same id as "aaa").</p></div></section><section id="why-hashids"><h2>Why "hashids"?</h2><div><p>Originally the project referred to generated ids as <i>hashes</i>, and obviously the name hashids has the word <i>hash</i> in it. Technically, these generated ids cannot be called hashes since a cryptographic hash has one-way mapping (cannot be decrypted).</p><p>However, when people search for a solution, like a "youtube hash" or "bitly short id", they usually don't really care of the technical details. So <em>hashids</em> stuck as a term — an algorithm to obfuscate numbers.</p></div></section><section id="decoding"><h2>Decoding without salt</h2><div><p>Do you have a question or comment that involves "security" and "hashids" in the same sentence? <em>Don't use Hashids</em>. Here are some ways to decode:</p><ol><li>Use a <a target="_blank" href="https://en.wikipedia.org/wiki/Brute-force_attack">brute-force attack</a>. These ids are short, get a big dictionary and this shouldn't be too hard.</li><li>Use an even faster method <a target="_blank" href="http://carnage.github.io/2015/08/cryptanalysis-of-hashids">with this blog post</a>.</li></ol></div></section><section id="contributing"><h2>How to contribute</h2><div><div class="octocat-split octocat-split-right"><div><p>If you've found a bug, please open a github issue in the <a href="#repo">appropriate repository</a>. Bonus points if you submit a pull request with it.</p><p>If an implementation in your favorite language is missing, feel free to port it over from one of the existing versions. There's still plenty of languages to contribute in: <a target="_blank" href="http://programming.nu/">Nu</a>, <a target="_blank" href="http://groovy-lang.org/">Groovy</a>, <a target="_blank" href="http://racket-lang.org/">Racket</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/Scheme_(programming_language)">Scheme</a>, <a target="_blank" href="http://www.tcl.tk/">Tcl</a>, <a target="_blank" href="https://opendylan.org/">Dylan</a>, <a target="_blank" href="http://lolcode.org/">Lolcode</a>, <a target="_blank" href="https://factorcode.org/">Factor?</a></p><p>We try to keep the library versions compatible. If you see an outdated version in an existing implementation, please open a github issue in that repository — show your +1 support for that issue.</p></div><div><a target="_blank" href="https://octodex.github.com/" class="no-effect"><img src="/public/img/codercat.jpg" alt=""></a><span class="subtext">codercat by <a target="_blank" href="https://github.com/cameronmcefee">cameronmcefee</a></span></div></div></div></section><section id="usage"><h2>Are you using Hashids?</h2><div>Whether it's an open-source project or a commercial product, tell us at <a href="https://github.com/hashids/hashids.github.io/wiki/Who's-Using-Hashids" target="_blank">https://github.com/hashids/hashids.github.io/wiki/Who's-Using-Hashids</a> !</div></section><section id="elsewhere"><h2>Hashids elsewhere</h2><div><p>If you have a question about Hashids, a lot has already been answered. Try checking one of these:</p><ul><li><i class="fa fa-stack-overflow"></i> <a rel="nofollow" target="_blank" href="https://stackoverflow.com/search?q=%22hashids%22">StackOverflow</a></li><li><i class="fa fa-twitter"></i> <a rel="nofollow" target="_blank" href="https://twitter.com/search?f=realtime&q=%23hashids">Twitter</a></li></ul></div></section><section id="contributors"><h2>Maintainers</h2><div><p>Many thanks to the numerous folks that have implemented the different versions, plugins, extensions as well as to those that have suggested general improvements.</p><ul class="people"><li><a target="_blank" href="https://github.com/speps"><img src="https://avatars.githubusercontent.com/speps" width="100" height="100" alt=""><h2>Remi Gillig</h2><span>Go</span></a></li><li><a target="_blank" href="https://github.com/peterhellberg"><img src="https://avatars.githubusercontent.com/peterhellberg" width="100" height="100" alt=""><h2>Peter Hellberg</h2><span>Ruby</span></a></li><li><a target="_blank" href="https://github.com/davidaurelio"><img src="https://avatars.githubusercontent.com/davidaurelio" width="100" height="100" alt=""><h2>David Aurelio</h2><span>Python</span></a></li><li><a target="_blank" href="https://github.com/ullmark"><img src="https://avatars.githubusercontent.com/ullmark" width="100" height="100" alt=""><h2>Markus Ullmark</h2><span>.NET</span></a></li><li><a target="_blank" href="https://github.com/zakame"><img src="https://avatars.githubusercontent.com/zakame" width="100" height="100" alt=""><h2>Zak B. Elep</h2><span>Perl</span></a></li><li><a target="_blank" href="https://github.com/leihog"><img src="https://avatars.githubusercontent.com/leihog" width="100" height="100" alt=""><h2>Leif Högberg</h2><span>Lua</span></a></li><li><a target="_blank" href="https://github.com/fanweixiao"><img src="https://avatars.githubusercontent.com/fanweixiao" width="100" height="100" alt=""><h2>fanweixiao</h2><span>Java</span></a></li><li><a target="_blank" href="https://github.com/alco"><img src="https://avatars.githubusercontent.com/alco" width="100" height="100" alt=""><h2>Alexei Sholik</h2><span>Elixir</span></a></li><li><a target="_blank" href="https://github.com/dswitzer"><img src="https://avatars.githubusercontent.com/dswitzer" width="100" height="100" alt=""><h2>Dan G. Switzer, II</h2><span>ColdFusion</span></a></li><li><a target="_blank" href="https://github.com/schoentoon"><img src="https://avatars.githubusercontent.com/schoentoon" width="100" height="100" alt=""><h2>Toon Schoenmakers</h2><span>C++11</span></a></li><li><a target="_blank" href="https://github.com/newhoggy"><img src="https://avatars.githubusercontent.com/newhoggy" width="100" height="100" alt=""><h2>John Ky</h2><span>Scala</span></a></li><li><a target="_blank" href="https://github.com/tzvetkoff"><img src="https://avatars.githubusercontent.com/tzvetkoff" width="100" height="100" alt=""><h2>Latchezar Tzvetkoff</h2><span>C</span></a></li><li><a target="_blank" href="https://github.com/leprosus"><img src="https://avatars.githubusercontent.com/leprosus" width="100" height="100" alt=""><h2>Denis Korolev</h2><span>Kotlin</span></a></li><li><a target="_blank" href="https://github.com/achesak"><img src="https://avatars.githubusercontent.com/achesak" width="100" height="100" alt=""><h2>Adam Chesak</h2><span>Nim</span></a></li><li><a target="_blank" href="https://github.com/tmorehouse"><img src="https://avatars.githubusercontent.com/tmorehouse" width="100" height="100" alt=""><h2>Troy Morehouse</h2><span>VBA</span></a></li><li><a target="_blank" href="https://github.com/malczak"><img src="https://avatars.githubusercontent.com/malczak" width="100" height="100" alt=""><h2>Mateusz Małczak</h2><span>Swift</span></a></li><li><a target="_blank" href="https://github.com/jstrutz"><img src="https://avatars.githubusercontent.com/jstrutz" width="100" height="100" alt=""><h2>Jason Strutz</h2><span>Clojure</span></a></li><li><a target="_blank" href="https://github.com/snaiper80"><img src="https://avatars.githubusercontent.com/snaiper80" width="100" height="100" alt=""><h2>Lee GiTack</h2><span>Erlang</span></a></li><li><a target="_blank" href="https://github.com/charsyam"><img src="https://avatars.githubusercontent.com/charsyam" width="100" height="100" alt=""><h2>Char Syam</h2><span>Rust</span></a></li><li><a target="_blank" href="https://github.com/laserpants"><img src="https://avatars.githubusercontent.com/laserpants" width="100" height="100" alt=""><h2>Johannes Hildén</h2><span>Haskell</span></a></li><li><a target="_blank" href="https://github.com/jovanpn"><img src="https://avatars.githubusercontent.com/jovanpn" width="100" height="100" alt=""><h2>Jovan Nikolić</h2><span>ActionScript</span></a></li><li><a target="_blank" href="https://github.com/benwilber"><img src="https://avatars.githubusercontent.com/benwilber" width="100" height="100" alt=""><h2>Ben Wilber</h2><span>Bash</span></a></li><li><a target="_blank" href="https://github.com/ALShum"><img src="https://avatars.githubusercontent.com/ALShum" width="100" height="100" alt=""><h2>Alex Shum</h2><span>R</span></a></li><li><a target="_blank" href="https://github.com/Actimia"><img src="https://avatars.githubusercontent.com/Actimia" width="100" height="100" alt=""><h2>Viking Edström</h2><span>D</span></a></li><li><a target="_blank" href="https://github.com/rbertels"><img src="https://avatars.githubusercontent.com/rbertels" width="100" height="100" alt=""><h2>Rob Bertels</h2><span>F#</span></a></li><li><a target="_blank" href="https://github.com/waynebloss"><img src="https://avatars.githubusercontent.com/waynebloss" width="100" height="100" alt=""><h2>Wayne Bloss</h2><span>TSQL</span></a></li><li><a target="_blank" href="https://github.com/kevinresol"><img src="https://avatars.githubusercontent.com/kevinresol" width="100" height="100" alt=""><h2>Kevin Leung</h2><span>Haxe</span></a></li><li><a target="_blank" href="https://github.com/pdamoc"><img src="https://avatars.githubusercontent.com/pdamoc" width="100" height="100" alt=""><h2>Petre Damoc</h2><span>Elm</span></a></li><li><a target="_blank" href="https://github.com/alacap"><img src="https://avatars.githubusercontent.com/alacap" width="100" height="100" alt=""><h2>Alan Capewell</h2><span>Smalltalk</span></a></li><li><a target="_blank" href="https://github.com/DrGodCarl"><img src="https://avatars.githubusercontent.com/DrGodCarl" width="100" height="100" alt=""><h2>Carl D. Benson</h2><span>Objective-C</span></a></li><li><a target="_blank" href="https://github.com/kalkin"><img src="https://avatars.githubusercontent.com/kalkin" width="100" height="100" alt=""><h2>Bahtiar Gadimov</h2><span>Perl 6</span></a></li><li><a target="_blank" href="https://github.com/splattael"><img src="https://avatars.githubusercontent.com/splattael" width="100" height="100" alt=""><h2>Peter Leitzen</h2><span>Crystal</span></a></li><li><a target="_blank" href="https://github.com/vinkla"><img src="https://avatars.githubusercontent.com/vinkla" width="100" height="100" alt=""><h2>Vincent Klaiber</h2><span>PHP</span></a></li><li><a target="_blank" href="https://github.com/iCyberon"><img src="https://avatars.githubusercontent.com/iCyberon" width="100" height="100" alt=""><h2>Vahagn Mkrtchyan</h2><span>PostgreSQL</span></a></li><li><a target="_blank" href="https://github.com/jacquev6"><img src="https://avatars.githubusercontent.com/jacquev6" width="100" height="100" alt=""><h2>Vincent Jacques</h2><span>OCaml</span></a></li><li><a target="_blank" href="https://github.com/olexale"><img src="https://avatars.githubusercontent.com/olexale" width="100" height="100" alt=""><h2>Oleksandr Leuschenko</h2><span>Dart</span></a></li><li><a target="_blank" href="https://github.com/KennethanCeyer"><img src="https://avatars.githubusercontent.com/KennethanCeyer" width="100" height="100" alt=""><h2>Kennethan Ceyer</h2><span>Io</span></a></li><li><a target="_blank" href="https://github.com/rhux"><img src="https://avatars.githubusercontent.com/rhux" width="100" height="100" alt=""><h2>Robert Hux</h2><span>PLpgSQL</span></a></li><li><a target="_blank" href="https://github.com/antimon2"><img src="https://avatars.githubusercontent.com/antimon2" width="100" height="100" alt=""><h2>GOTOH Shunsuke</h2><span>Julia</span></a></li><li><a target="_blank" href="https://github.com/niieani"><img src="https://avatars.githubusercontent.com/niieani" width="100" height="100" alt=""><h2>Bazyli Brzóska</h2><span>JavaScript</span></a></li></ul></div></section><section id="license"><h2>License</h2><div>All hashids libraries are under <a target="_blank" href="https://opensource.org/licenses/MIT">MIT license</a>. You can use them in open source projects and commercial products. Don't break the Internet. Kthxbye.</div></section></div></div><div class="footer"><div class="social-buttons"><a href="https://twitter.com/intent/tweet?button_hashtag=hashids&text=Generate%20short%20unique%20ids%20from%20integers%20#javascript" class="twitter-hashtag-button" data-url="http://hashids.org">Tweet #hashids</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script><div class="fb-like" data-href="https://hashids.org/" data-layout="button_count" data-action="like" data-show-faces="false" data-share="false"></div></div><p>Hashids is under <a target="_blank" href="https://opensource.org/licenses/MIT">MIT license</a></p><p>Website <span class="copyleft">©</span> Hashids <span class="copyright-year"></span> · <a target="_blank" href="https://github.com/hashids/hashids.github.io">Github</a> · <a target="_blank" href="https://github.com/hashids/hashids.github.io/issues">Issues</a> · <a target="_blank" href="https://github.com/hashids/hashids.github.io/wiki/Who's-Using-Hashids">Are you using Hashids?</a></p></div><script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script><script src="/public/js/lib/highlight-pack-1.0.1.min.js"></script><script src="/public/js/lib/jquery.flexslider-min.js"></script><script src="/public/js/lib/hashids.min.js"></script><script src="/public/js/lib/app-1.1.0.min.js"></script><div id="fb-root"></div><script>(function(e,t,n){var r,i=e.getElementsByTagName(t)[0];if(e.getElementById(n))return;r=e.createElement(t);r.id=n;r.src="//connect.facebook.net/en_US/all.js#xfbml=1";i.parentNode.insertBefore(r,i)})(document,"script","facebook-jssdk")</script><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script><script type="text/javascript">var _gaq=_gaq||[];_gaq.push(["_setAccount","UA-31950226-1"]);_gaq.push(["_trackPageview"]);(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src=("https:"==document.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})()</script></body></html>