npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

edid

v0.1.2

Published

Human and url friendly (e)xtensible (d)istributed (id)s.

Downloads

7

Readme

Human and url friendly (e)xtensible (d)istributed (id)s

Generate unique ids based on current UTC time in milliseconds, shard number and loopback counter. Shard number can be automatically calculated from a parent of the object (owner id, scope, blog id). It allows to group objects related to same parent in same shard.

Parts of id are encoded using Bitcoin's variant of base58. It's both human and url friendly. Bitcoin variant of base58 is chosen because encoded numbers can be properly sorted. It's guaranteed that if A > B then base58(A) > base58(B) for string of same length. It's not true for Flickr's variant of base58 or base64 and base62.

Time in milliseconds passed since 1970 year (Javascripts's Date.now()) is stored in first 8 chars, loopback counter -- next 2 chars, shard number -- last 3 chars. This scheme allows to gurantee proper sorting of ids by time for next 4000 years (I think humanity will destroy itself early but let's hope). 3 chars used for encoding shard number allows to spread ids across 195112 (58^3) logical shards (if you blog will need more shards, please ping me and you will receive new reader).

This id generator is designed to simplify database partitioning that doesn't play well with autoincrement id fields typical for databases. There are several alternatives like well-known MongoDB's ObjectId but our approach allows to load object by id from correct shard immediately because we keep logical shard number inside id. It results in faster requests and better query isolation. Generated ids are increased monotonically that results in less fragmentation of index comparing with hash-based ids or random UUIDs. For time part is used less than 48 bits to allow safe usage with Javascript's numbers (52 bits only are allowed for mantissa).

Our approach have a lot in common with Sharding & IDs at Instagram but date range for our ids isn't limited to 41 years. In default setup our ids can be represented as 64-bits integers during 146 years. However our main advantage is extensibility. After 41 years Instagram's numeric ids will stop to work and you will need to migrate to new format, but our string ids will continue to work even when 146 years have elapsed (new ids will not fit into 64-bit data range however).

Instagram's IDs are generated on database level using PostgreSQL server functions to maintain generators state. EDID can generate IDs on client or app server as well.

Copyright (C) 2015 Dmytro V. Dogadailo

This program is free software; you can redistribute it and/or modify it under the terms of the MIT License.