From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, MAILING_LIST_MULTI autolearn=unavailable autolearn_force=no version=3.4.4 X-Google-Thread: 103376,14be6619f79b4573 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news3.google.com!news2.google.com!proxad.net!usenet-fr.net!news.enst.fr!melchior!cuivre.fr.eu.org!melchior.frmug.org!not-for-mail From: Duncan Sands Newsgroups: comp.lang.ada Subject: Re: Hashing on System.Address Date: Tue, 14 Jun 2005 12:14:13 +0200 Organization: Cuivre, Argent, Or Message-ID: References: NNTP-Posting-Host: lovelace.ada-france.org Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Trace: melchior.cuivre.fr.eu.org 1118744082 48768 212.85.156.195 (14 Jun 2005 10:14:42 GMT) X-Complaints-To: usenet@melchior.cuivre.fr.eu.org NNTP-Posting-Date: Tue, 14 Jun 2005 10:14:42 +0000 (UTC) Cc: Marius Amado Alves To: comp.lang.ada@ada-france.org Return-Path: User-Agent: KMail/1.8.1 In-Reply-To: Content-Disposition: inline X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at ada-france.org X-BeenThere: comp.lang.ada@ada-france.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Gateway to the comp.lang.ada Usenet newsgroup" List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Xref: g2news1.google.com comp.lang.ada:11344 Date: 2005-06-14T12:14:13+02:00 On Tuesday 14 June 2005 12:03, Marius Amado Alves wrote: > > ... The other thing I haven't really figured out is what to do > > if you have a 64-bit address, and Hash_Type is only 32... > > I gave a general solution to this class of cases before: > > << > Treat both the input and output values as bit strings X (1 .. M) and Y > (1 .. N) respectively. (Use representation clauses, packed arrays, and > unchecked conversion for this.) Make N small, say 16. Set Y bits to the > value of X bits as follows: > > if M > N, Y (J) = X (1 + (J - 1) * M / N), for J in 1 .. N > > if M = N, Y = X > > if M < N, initialize Y to all zeros, > then let Y (1 + (I - 1) * N / M) = X (I), for I in 1 .. M > >> Hi Marius, thanks for the suggestion. A few comments though: if M > N (say M = 2*N) then you're skipping every second bit in X. Why not use them - mix them in somehow? If M < N then you are trying to spread the bits of X evenly throughout Y. Are there any theoretical reasons to think this is a good strategy? Finally, I'm betting the code produced is kind of yucky. It would be nice to have a solution that resulted in a small number of simple bit operations. All the best, Duncan.