Ticket #4957: trac-4957.patch

File trac-4957.patch, 1.8 KB (added by craigcitro, 14 years ago)
  • c_lib/src/mpn_pylong.c

    # HG changeset patch
    # User Craig Citro <craigcitro@gmail.com>
    # Date 1232714817 28800
    # Node ID c578f06ce684230cfb6ad2dedd9dc45a8cdc1e42
    # Parent  daa90769ff1093afc4e69d5331032b7b26d8c10f
    Fix hash issue with integers (trac #4957).
    
    diff -r daa90769ff10 -r c578f06ce684 c_lib/src/mpn_pylong.c
    a b  
    212212        {
    213213          /* Force a native long #-bits (32 or 64) circular shift */
    214214          x = ((x << SHIFT) & ~MASK) | ((x >> LONG_BIT_SHIFT) & MASK);
    215           x += (n1 >> bit_pos) & MASK;
     215          /* Shifting to the right by more than wordsize bits
     216             actually shifts by (wordsize % 32) bits -- which is
     217             *not* the intended behavior here. */
     218          if (bit_pos <= 8*sizeof(mp_limb_t))
     219            x += (n1 >> bit_pos) & MASK;
    216220          bit_pos -= SHIFT;
    217221        }
    218222      i--;
  • sage/rings/integer.pyx

    diff -r daa90769ff10 -r c578f06ce684 sage/rings/integer.pyx
    a b  
    20882088            sage: hash(long(n))
    20892089            -873977844            # 32-bit
    20902090            6874330978542788722   # 64-bit
     2091
     2092        These tests come from trac #4957.
     2093            sage: n = 2^31 + 2^13
     2094            sage: hash(n)
     2095            -2147475456               # 32-bit
     2096            2147491840                # 64-bit
     2097            sage: hash(n) == hash(int(n))
     2098            True
     2099            sage: n = 2^63 + 2^13
     2100            sage: hash(n)
     2101            -2147475456               # 32-bit
     2102            -9223372036854767616      # 64-bit
     2103            sage: hash(n) == hash(int(n))
     2104            True
    20912105        """
    20922106        return mpz_pythonhash(self.value)
    20932107