[libvirt] [PATCH] Replace hashing algorithm with murmurhash

Daniel P. Berrange berrange at redhat.com
Wed Jan 25 17:15:02 UTC 2012


On Wed, Jan 25, 2012 at 09:55:25AM -0700, Eric Blake wrote:
> On 01/25/2012 09:38 AM, Daniel P. Berrange wrote:
> >>> -static unsigned long virCgroupPidCode(const void *name)
> >>> +static int32_t virCgroupPidCode(const void *name, int32_t seed)
> >>>  {
> >>> -    return (unsigned long)name;
> >>> +    unsigned long pid = (unsigned long)name;
> >>> +    return virHashCodeGen(&pid, sizeof(pid), seed);
> >>
> >> I'm not sure if it matters, but you could shorten these two lines to
> >> just one:
> >>
> >> return virHashCodeGen(&name, sizeof(unsigned long), seed);
> > 
> > I actually preferred the slightly more verbose style, to make
> > it clearer that we're actually passing in the PID as an int,
> > cast to a pointer, instead of an int pointer.
> 
> And given the recent thread about mingw32, this is wrong anyways.
> There, 'unsigned long' is 32 bits, but pid_t is 64 bits, so we'd be
> losing information in our hash.  We probably need to fix this code to be
> passing (void *)&pid_t and dereferencing the pointer to get to a full
> pid, rather than cheating with (void*)(unsigned long)pid_t and possibly
> losing bits (although since this is in a context of hashing, lost bits
> only means more chance for collision, and not a fatal algorithmic flaw).

Actually given the context of this usage, we don't need to use pid_t
here. The values come from doing  scanf("%lu") on the cgroups task
file, and this will only ever run on a Linux host.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list