- Feature Articles
- CodeSOD
- Error'd
- Forums
-
Other Articles
- Random Article
- Other Series
- Alex's Soapbox
- Announcements
- Best of…
- Best of Email
- Best of the Sidebar
- Bring Your Own Code
- Coded Smorgasbord
- Mandatory Fun Day
- Off Topic
- Representative Line
- News Roundup
- Editor's Soapbox
- Software on the Rocks
- Souvenir Potpourri
- Sponsor Post
- Tales from the Interview
- The Daily WTF: Live
- Virtudyne
Admin
Get it to pass a unit test. Winning! Ship!
Admin
pass the brain bleach
Admin
unique-comment-0a
Admin
carves Guid.NewGuid() into a clue-by-four and goes hunting for the developer who wrote the abomination in the article
Admin
If you can increment guids, then you should be able to add, subtract, multiply and divide them, too.
Admin
Actually... no. Incrementing doesn't require arithmetic operations to be defined. It just requires, that for each element of the domain a successor is defined; While for number domains this typically is related to addition, it doesn't need to be.
For instance, you may define the increment of "A" to be "B" on the domain of latin letters, but it isn't necessary to define the meaning of "A+A" or other arithmetic operations. Neither does a defined addition operation imply a meaningful definition of "increment". The only case I can think of, where addition and increment are somewhat naturally related are really integers.
Admin
Just why this might be useful: If you start with one truly random GUID and then create further GUIDs in sequential order (and others do the same thing), you reduce the tiny, tiny likelihood of collisions even further. There is a price to pay: IF you have collisions you will probably have a lot of them.
Admin
Wouldn't it have just been easier to split on the dashes, parse it as base-16 integers, do the math (with overflows), and format it back out to text?
Although, I wonder why they needed them to be sequential? I've used them specifically to avoid implicit ordering of auto-increment fields. In those cases, a timestamp or some other form of deliberate ordering was employed...
Admin
If you want sequential numbering, why are you using GUIDs? Why not just use, I dunno, sequential integers? Obviously that has potential problems with race conditions, but if the sequence of IDs is important, that's also a problem with using GUIDs.
Admin
Well, NEWSEQUENTIALID() is a thing. But I'm pretty sure it doesn't look like this under the hood.
Admin
I love the error handling. "Error", "error" and ex.Message. Their code base must be so broken.
Admin
We use seq. GUIDs generated by the RDBMS as an indexable primary key for our data. Our data is synchronized between DBs on 3000 user PCs and one central DB hosted by us. Sequential integers are not unique between computers, but GUIDs by definition are.
Sequential does not necessarily mean that each number (or GUID) in the sequence be incremented by one, just by a logical difference. E.G., the Fibonacci sequence. As long as they increase (or decrease) in a sequence, then the IDs are indexable and are usable as an index in an RDBMS.
Admin
No comments about "return ex.Message"?
Now that's an odd guid...
Admin
I believe the incremented GUID has the same probability of colliding with some other pre-existant value as a truly random one does.
Admin
So The Real WTF (TM) is that this method exists at all, much less his implementation and broken error handling.
Admin
The expected number of collisions cannot be changed. But if you and I both create a million sequential GUIDs, the chance of any collision is much lower. The chance of lots of collisions is much higher.
It’s like buying 1000 lottery tickets, all with the same numbers. The chances of winning are a lot lower than with 1000 random tickets, but you have a chance to win 1000 prices.
Admin
As long as the order ids are allocated matters, you have to allocate sequentially. In which case whether the sequence increments by one or not is irrelevant. But natural numbers seem more, well, natural to me.
Admin
I wonder why the "else" was commented. Maybe it didn't work.
Admin
nHibernate has a generator method for identity called Guid.Comb. Basically, the first one is done using one method and then subsequent ids are "incremented" for some definition of increment. It is a faster way to generate when you are inserting a bunch of new records at the same time.
Admin
I suspect it would be easier to simply call a function to ask for a new GUID. You know, like GUID.NewGuid().
But that's just me, and you were clearly being sarcastic anyway.
(If you really, really, want to perform Peano-like arithmetic on GUIDs, of course, you could simply store them in a Dictionary with added ordinal goodness. I don't imagine that we're going to run out of 64-bit integers any time soon.)
Admin
DevDude, are you clustered on your PK? If not, I think that can be acceptable. Otherwise, it is a bit of space consumption to make that your clustered key and then having that cost on all your indexes.
Everyone else, There are cases where Sequential GUID will make sense, and there is plenty of support for such things in RDBMSes, such as SQL Server. You can find articles suggesting potential merits of doing this in the app layer (moreso than the DB layer. Mertis such as not round-tripping, although there is more than one way to skin this cat)
Here are some interesting articles, discussing pros, cons, etc: https://blog.greglow.com/2017/10/26/newsequentialid-nice-try-but-missed-the-target/ https://www.brentozar.com/archive/2014/08/generating-identities/
Admin
You haven't been around for long enough. People have tried adding A+A for sure.
Admin
Or you could stick a sequence integer on the end of the GUID. Which with this bozo would probably cause problems the first time a tenth increment was needed, as the string went from "-9" to "-10", and sorted after "-1".
Admin
IIRC we do have a few clustered indexes - but most (as in almost all) are not clustered. The space that they consume is not an issue in our schema; we have non-indexed data columns that consume many orders of magnitude more space than a GUID (or the indexes based on them) and there is no way around that (no, it cannot be compressed - it already is).
Admin
I didn't realize the most obvious example: Dates.
It is perfectly possible to define an increment for dates (e.g. "next day", "next week", "next month"...), but adding, subtracting, multiplying or dividing dates has no meaningful definition.
Admin
Except it's not just "error" - it's the original input with its last character replaced with the word "error".
Admin
If you want to have "sequential GUIDs" - why not make the already long string a tiny bit longer by just appending a sequential number?