Ideal way to generate a unique reference code?

Published 2 months ago by MyLibrary

Hey guys, I would like to generate a unique reference code in my system for Orders, Procurement and Transactions. Do you have any suggestions how big should be the reference code and how should I implement it in an efficient way? The system should have xxx procurement per year, xxxx orders per year and about xxxx transactions per year.

Thanks for your help!

Snapey
Snapey
2 months ago (577,135 XP)

can you just use the primary key from each model? Do you have to ensure the numbers are contiguous?

MyLibrary

Hey @Snapey , Yes, I absolutely can, but I need the reference code to be something unique so I can also use in external platforms. (External service providers such as shipping carriers and so on).

Thanks!

cawex
cawex
2 months ago (19,250 XP)

Does it have to increment, in a order that makes sense?

If no then you can look into Ramset\Uuid https://github.com/ramsey/uuid

If you want the increment to make sense, you could do a prefix and then the ID as Snapey is saying.

MyLibrary

@cawex, It does have also a regular Id (incremental Id) but also need a reference id.

That looks nice, but might need something a bit shorter. I've used the uniqid() function, do you think it is strong enough guys?

cawex
cawex
2 months ago (19,250 XP)

@MyLibrary

So if it's a really small application I think you are safe, but I would not recommend it, PHP's uniqid() is not actually unique, see their php.net here: http://php.net/manual/en/function.uniqid.php

cawex
cawex
2 months ago (19,250 XP)

Can't you do something like:

982357881
982357882
982357883
982357884
982357885
982357886
982357887
982357888
982357889
982357891
982357892

so you have a prefix, but it increment on the prefix, if it make sense. You could probably achieve this with substr()

Talky

how about just using bcrypt() on a random string and request rule reference code being unique? check if it's unique, if not, get a random string again and bcrypt it.

MyLibrary

@cawex, I can use a validation to check if it unique, otherwise creating a new uniqid(). The prefix suggestion will create different size reference code with time, and I would prefer to keep it at the same length at this moment.

@Talky, that idea might work, but bcrypt generates a long reference code.

I wonder if there is something not too short and not too long that will include the microtime, the model type (for example order) and the model id, and then make a unique string out of that, what do you think guys?

At this moment I'm using:

strtoupper(uniqid('OR')) // OR stands for Orders prefix.

Thanks for your help guys!

cawex
cawex
2 months ago (19,250 XP)

@MyLibrary No it wouldn't as long as you don't go over that high a number else choose to have 10 digits.

Snapey
Snapey
2 months ago (577,135 XP)

I'm still unsure if you need it to be incremental?

Are you wanting it to be 'random' so that it cannot be guessed, or sequential like a an invoice number INV00001, INV00002 etc

If random then you could use a separate table, pre-populated with random reference numbers (all unique). Using transactions, take the next number and store what it was used for (entity and id) ?

Does it need to be a number? Could you use the hashids package?

Sign In or create a forum account to participate in this discussion.