Re: hashlittle(), hashbig(), hashword() and endianness

Поиск
Список
Период
Сортировка
От Kenneth Marshall
Тема Re: hashlittle(), hashbig(), hashword() and endianness
Дата
Msg-id 20071116133042.GT11020@it.is.rice.edu
обсуждение исходный текст
Ответ на Re: hashlittle(), hashbig(), hashword() and endianness  (Alex Vinokur <alexvn@users.sourceforge.net>)
Список pgsql-patches
On Fri, Nov 16, 2007 at 01:19:13AM -0800, Alex Vinokur wrote:
> On Nov 15, 1:23 pm, hei...@enterprisedb.com (Heikki Linnakangas)
> wrote:
> > Alex Vinokurwrote:
> > > On Nov 15, 10:40 am,Alex Vinokur<ale...@users.sourceforge.net>
> > > wrote:
> > > [snip]
> > >> I have some question concerning Bob Jenkins' functions
> > >> hashword(uint32_t*, size_t), hashlittle(uint8_t*, size_t) and
> > >> hashbig(uint8_t*, size_t) in lookup3.c.
> >
> > >> Let k1 by a key: uint8_t* k1; strlen(k1)%sizeof(uint32_t) == 0.
> >
> > >> 1. hashlittle(k1) produces the same value on Little-Endian and Big-
> > >> Endian machines.
> > >>    Let hashlittle(k1) be == L1.
> >
> > >> 2. hashbig(k1) produces the same value on Little-Endian and Big-Endian
> > >> machines.
> > >>    Let hashbig(k1) be == B1.
> >
> > >>   L1 != B1
> >
> > >> 3. hashword((uint32_t*)k1) produces
> > >>     * L1 on LittleEndian machine and
> > >>     * B1 on BigEndian machine.
> >
> > > ===================================
> > >> ---------------------
> > >> The question is: is it possible to change hashword() to get
> > >>     * L1 on Little-Endian machine and
> > >>     * B1 on Big-Endian machine
> > >>    ?
> >
> > > Sorry, it should be as follows:
> >
> > > Is it possible to create two new hash functions on basis of
> > > hashword():
> > >    i)  hashword_little () that produces L1 on Little-Endian and Big-
> > > Endian machines;
> > >    ii) hashword_big ()    that produces B1 on Little-Endian and Big-
> > > Endian machines
> > >    ?
> >
> > Why?
> >
> [snip]
>
> Suppose:
> uint8_t chBuf[SIZE32 * 4];  // ((size_t)&chBuf[0] & 3) == 0
>
> Function
> hashlittle(chBuf, SIZE32 * 4, 0)
> produces the same hashValue (let this value be L1) on little-endian
> and big-endian machines. So, hashlittle() is endianness-indepent.
>
> On other hand, function
> hashword ((uint32_t)chBuf, SIZE32, 0)
> produces hashValue == L1 on little-endian machine and hashValue != L1
> on big-endian machine. So, hashword() is endianness-dependent.
>
> I would like to use both hashlittle() and hashword() (or
> hashword_little) on little-endian and big-endian machine and to get
> identical hashValues.
>
>
> Alex Vinokur
>      email: alex DOT vinokur AT gmail DOT com
>      http://mathforum.org/library/view/10978.html
>      http://sourceforge.net/users/alexvn
>
>
Alex,

As I suspected, you want a hash function that is independent of the
machine endian-ness. You will need to design, develop, and test such
a function yourself. As you start to look at how overflow, rot's, and
shifts are handled at the boundaries you may find it difficult to
get a fast hash function with those properties. Good luck.

Regards,
Ken

В списке pgsql-patches по дате отправления:

Предыдущее
От: Zoltan Boszormenyi
Дата:
Сообщение: Problem with pg_dump -n schemaname
Следующее
От: Tom Lane
Дата:
Сообщение: Proposed patch for ANALYZE overcounting dead rows