index.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * cuid.js
  3. * Collision-resistant UID generator for browsers and node.
  4. * Sequential for fast db lookups and recency sorting.
  5. * Safe for element IDs and server-side lookups.
  6. *
  7. * Extracted from CLCTR
  8. *
  9. * Copyright (c) Eric Elliott 2012
  10. * MIT License
  11. */
  12. var fingerprint = require('./lib/fingerprint.js');
  13. var pad = require('./lib/pad.js');
  14. var getRandomValue = require('./lib/getRandomValue.js');
  15. var c = 0,
  16. blockSize = 4,
  17. base = 36,
  18. discreteValues = Math.pow(base, blockSize);
  19. function randomBlock () {
  20. return pad((getRandomValue() *
  21. discreteValues << 0)
  22. .toString(base), blockSize);
  23. }
  24. function safeCounter () {
  25. c = c < discreteValues ? c : 0;
  26. c++; // this is not subliminal
  27. return c - 1;
  28. }
  29. function cuid () {
  30. // Starting with a lowercase letter makes
  31. // it HTML element ID friendly.
  32. var letter = 'c', // hard-coded allows for sequential access
  33. // timestamp
  34. // warning: this exposes the exact date and time
  35. // that the uid was created.
  36. timestamp = (new Date().getTime()).toString(base),
  37. // Prevent same-machine collisions.
  38. counter = pad(safeCounter().toString(base), blockSize),
  39. // A few chars to generate distinct ids for different
  40. // clients (so different computers are far less
  41. // likely to generate the same id)
  42. print = fingerprint(),
  43. // Grab some more chars from Math.random()
  44. random = randomBlock() + randomBlock();
  45. return letter + timestamp + counter + print + random;
  46. }
  47. cuid.slug = function slug () {
  48. var date = new Date().getTime().toString(36),
  49. counter = safeCounter().toString(36).slice(-4),
  50. print = fingerprint().slice(0, 1) +
  51. fingerprint().slice(-1),
  52. random = randomBlock().slice(-2);
  53. return date.slice(-2) +
  54. counter + print + random;
  55. };
  56. cuid.isCuid = function isCuid (stringToCheck) {
  57. if (typeof stringToCheck !== 'string') return false;
  58. if (stringToCheck.startsWith('c')) return true;
  59. return false;
  60. };
  61. cuid.isSlug = function isSlug (stringToCheck) {
  62. if (typeof stringToCheck !== 'string') return false;
  63. var stringLength = stringToCheck.length;
  64. if (stringLength >= 7 && stringLength <= 10) return true;
  65. return false;
  66. };
  67. cuid.fingerprint = fingerprint;
  68. module.exports = cuid;