For 64 bit word size: https://stackoverflow.com/questions/11376288/fast
-computing-of-log2-for-64-bit-integers/11398748#11398748

This can be derived from examples in https://graphics.stanford.edu/~sea
nder/bithacks.html which gives the 32 bit version.

However, the math/bits package gives you Len, which does the same
thing: https://golang.org/pkg/math/bits/

On Sun, 2018-04-08 at 08:45 -0700, Darko Luketic wrote:
> Yeah I'm not a math wiz and the older I get the harder I find maths.
> But sometimes you can't evade maths in programming.
> 
> So here's my question for math wizards.
> Essentially, I'm trying to write an url shortener.
> And I found this package I agree with (don't re-invent the wheel)
> https://github.com/neptulon/shortid
> 
> It base64-encodes a random number of [bits that need to be dividable
> by 8] 
> length.
> Dividable by 8 because 1 char = 8 bits.
> 
> It generates an input+1/8 length result.
> 
> What I like is, get a count of all links in the db, easy.
> But now the problem.
> 
> 8bit = 64^2 possible results without overlapping., 2 characters
> (therefore 
> 64^2)
> 16bit = 64^3 etc
> up to 64bit with would equal an uint64 value
> 
> My problem is computing the formula.
> if link_count > number_bits/2 {
>   number_bits++
> }
> 
> but how do I find out the bits?
> and make it future proof (yes even with the size of uint64)
> aka I must not define ranges e.g. >=0 <=(64^2)/2
> because I'm afraid the value would overflow in Go. (64^9)
> 
> I could
> exponent := 2 // starts at 2 because bits = (exponent-1)*8
> result := link_count / (64^exponent)
> if result < 1.0 {
>   number_bits = exponent-1
>   if result < 0.5 {
>     good_to_generate = true
>   } else {
>     exponent++
>   }
> }
> 
> but it would still probably overflow
> 
> However... MongoDB (my backing database), at least the mgo driver
> returns 
> an int, which on 64bit machines is int64.
> So there's my limit. Let's hope "int128" will be enough.
> 
> I guess I answered my own question. I'll still post it, because it
> took 
> some time to write.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to