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 🙏

© 2025 – Pkg Stats / Ryan Hefner

generic_hash_ring

v1.8.0

Published

**Hash Ring** (Consistent Hashing) library in TypeScript for uniformly distributing keys across nodes.

Downloads

12

Readme

HashRing

Hash Ring (Consistent Hashing) library in TypeScript for uniformly distributing keys across nodes.


📦 Installation

# Using npm
npm install generic_hash_ring

# Using yarn
yarn add generic_hash_ring

🚀 Basic Usage

import HashRing from 'generic_hash_ring'

interface Server {
  id: string
  host: string
}

// Create node instances
const nodes: Server[] = [
  { id: 'node1', host: '10.0.0.1' },
  { id: 'node2', host: '10.0.0.2' },
  { id: 'node3', host: '10.0.0.3' },
]

// Initialize the ring with 100 replicas per node
const ring = new HashRing<Server>(nodes, 100)

// Get the node responsible for a key
const key = 'user:1234'
const server = ring.getNode(key)

console.log(`Key "${key}" maps to:`, server)

🛠️ API

Constructor

new HashRing<T>(
  nodes?: T[],
  replicas?: number,
  hashFn?: (key: string) => string,
  spreadHashing?: boolean,
  sortFn?: (a: string, b: string) => number,
  nodeToString?: (node: T) => string
)
  • nodes (T[]) — Initial list of nodes.
  • replicas (number) — Virtual replicas per node (default: 50).
  • hashFn (key: string) => string — Custom hash function (default: SHA-256 hex).
  • spreadHashing (boolean) — Spread replicas to minimize adjacency (default: true).
  • sortFn (a: string, b: string) => number — Custom sort comparator for numeric hashes.
  • nodeToString (node: T) => string — Convert a node to a string key (default: toString/JSON).

Methods

addNode(node: T): void

Adds a node (and its replicas) to the ring.

removeNode(node: T): void

Removes a node (and all its replicas) from the ring.

getNode(key: string): T | undefined

Given a key, returns the corresponding node. Returns undefined if the ring is empty.

getNodesCount(): number

Number of physical nodes in the ring.


⚙️ Available Scripts

In package.json:

  • npm run build — Compiles TypeScript to JavaScript in ./dist.
  • npm run dev — Runs src/index.ts with ts-node.
  • npm start — Runs dist/index.js with Node.js.
  • npm run semantic-release — Automates versioning and publishing.

📖 Complete Example

import HashRing from 'generic_hash_ring'

type Node = string

// Initialize with two nodes and 50 replicas
const ring = new HashRing<Node>(['A', 'B'], 50)

// Assign several keys
const keys = ['alpha', 'beta', 'gamma', 'delta']

keys.forEach(k => {
  console.log(`Key="${k}" -> Node="${ring.getNode(k)}"`)
})

// Add a new node
ring.addNode('C')
console.log('\nAfter adding C:')
keys.forEach(k => {
  console.log(`Key="${k}" -> Node="${ring.getNode(k)}"`)
})

📄 License

This project is distributed under the Apache License 2.0.
See the LICENSE file for more details.