Re: Hash collision count
On Sat, 2005-04-23 at 19:20 -0400, Jeff Garzik wrote:
Show 25 quoted lines
> Ray Heasman wrote:
> > On Sat, 2005-04-23 at 16:27 -0400, Jeff Garzik wrote:
> >
> >>Ideally a hash + collision-count pair would make the best key, rather
> >>than just hash alone.
> >>
> >>A collision -will- occur eventually, and it is trivial to avoid this
> >>problem:
> >>
> >> $n = 0
> >> attempt to store as $hash-$n
> >> if $hash-$n exists (unlikely)
> >> $n++
> >> goto restart
> >> key = $hash-$n
> >>
> >
> >
> > Great. So what have you done here? Suppose you have 32 bits of counter
> > for n. Whoopee, you just added 32 bits to your hash, using a two stage
> > algorithm. So, you have a 192 bit hash assuming you started with the 160
> > bit SHA. And, one day your 32 bit counter won't be enough. Then what?
>
> First, there is no 32-bit limit. git stores keys (aka hashes) as
> strings. As it should.
Oh great, now we have variable length id strings too. And we'll have to pretend the OS can store infinite length file names.
> Second, in your scenario, it's highly unlikely you would get 4 billion
> sha1 hash collisions, even if you had the disk space to store such a git
> database.
Er. So your so-unlikely-the-sun-will-burn-out-first scenario beats my so-unlikely-the-sun-will-burn-out-first scenario? Why am I not worried?
Show 7 quoted lines
> > You aren't solving anything. You're just putting it off, and doing it in
> > a way that breaks all the wonderful semantics possible by just assuming
> > that the hash is unique. All of a sudden we are doing checks of data
> > that we never did before, and we have to do the check trillions of times
> > before the CPU time spent pays off.
>
> First, the hash is NOT unique.
Nooooo. Really?
Why not just use a 8192 bit hash for each 1KiB of data? We could store a zero length file and store all the data in the filename. Guaranteed, no hash collisions that way.
We make an assumption that we know is right most of the time, and we use it because we know our computer will crash from random quantum fluctuations before we have a chance of bumping into the problem. You do know that metastability means that every logic gate in your computer hardware is guaranteed to fail every "x" operations, where x is defined by process size, voltage and temperature? Sure, any failures in git would be data dependent rather than random, but that just means we don't get to store carefully crafted blocks invented by hypothetical cryptographers that have completely broken SHA.
> Second, you lose data if you pretend it is unique. I don't like losing
> data.
You lose data either way. Just we get to burn out a few extra suns before yours dies, and I can burn out whole galaxies before mine dies by using a 256 bit hash, anyway.
> Third, a data check only occurs in the highly unlikely case that a hash
> already exists -- a collision. Rather than "trillions of times", more
> like "one in a trillion chance."
Heh. I calculate it has a 50% probability of happening after you have seen 10^24 input blocks. So, you are off by a factor of a trillion or so.
Assuming we store 1 KiB blocks with a 160-bit hash, we would be able to store 1000 Trillion Terabytes before the chance of hitting a collision goes to 50%. To use marketing units, that is around 10 Trillion Libraries of Congress. Every 2 bits we add to the hash doubles the amount of data we can store before we hit a 50% probability of collision.
I'm not sure how I could convince you that we're arguing about the number of angels that could dance on a pin.
Ciao, Ray