Thanks for your responses.

On May 29, 2013, at 00:40, Martin Wawrusch wrote:

> Why not simply use base56 encoding of the object id?

I haven't tried base56 (is there a module or built-in function you'd recommend 
for that?) but a mongodb objectid begins with 4 bytes of timestamp, which will 
be very similar for large periods of time, and then 3 bytes of machineid and 2 
bytes of processid, which will be identical for large periods of time, so a 
base-anything encoding of such ids would tend to look quite similar. I'd like 
my user-facing ids to look "more random" than that.


On May 29, 2013, at 00:48, Stuart P. Bentley wrote:

> ```js
> modelSchema.virtual('hashid').get(function () {
>   var oidhex = this._id.toHexString();
>   return 
> hashids.encrypt(parseInt(oidhex.slice(0,12),16),parseInt(oidhex.slice(12),16));
> });
> 
> modelSchema.virtual('hashid').set(function (hashid) {
>   var halves = hashids.decrypt(hashid);
>   var zeroes = '000000000000';
>   this._id = new 
> ObjectID((zeroes+halves[0]).slice(-12)+(zeroes+halves[1]).slice(-12));
> });
> ```

Thanks, this is along the lines I was originally thinking. I just have to train 
myself to set and get the "hashid" field instead of the "id" field. I'll use 
this for now. Since I may need a hashid on multiple models, I made a function 
to add the virtuals which I can call when defining each model.

I was hoping for actual real-world experience though. How do I find a database 
record with a hashid? To find by objectid, I just do:

Thing.findOne({_id: req.params.thingid}, function(err, thing) {...});

It seems like even if finding on a virtual field works, it would be slow, since 
the index would be on the id, not the hashid. And as it turns out I can't get 
it to work; there's no error, it just doesn't return any results. So instead 
I've done:

Thing.findOne({_id: fromHashId(req.params.thingid)}, function(err, thing) 
{...});

where fromHashId does like your virtual('hashid').get() function.


On May 29, 2013, at 00:37, George Snelling wrote:

> FWIW, we scratched our head over the same problem, gave up, and wrote our own 
> _id generator. It's a glorified timestamp with a big random seed after 
> milliseconds part, formatted to be read by humans and look reasonable in 
> urls.  Since the high-order part increases with time, it shards well.  We 
> found it much easier to simply check for a unique index violation error on 
> insert and retry with a new key whenever that happens than to solve the 
> problem you're trying to solve.

That's good to know, thanks. What are other people actually using for their 
short ids, regardless of backend storage system? Are you generating them 
yourself? How are you dealing with collisions? Has it been a problem?

I want the impossible! :) I want short ids that people posting urls to twitter 
will appreciate, but I don't want collisions or the overhead of verifying that 
there aren't any.

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to