<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Dec 28, 2016 at 11:48 AM, Ned Batchelder <span dir="ltr"><<a href="mailto:ned@nedbatchelder.com" target="_blank">ned@nedbatchelder.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF">You can write a simple function to use hash iteratively to hash the
    entire stream in constant space and linear time:<br>
    <br>
        def hash_stream(them):<br>
            val = 0<br>
            for it in them:<br>
                val = hash((val, it))<br>
            return val<br>
    <br>
    Although this creates N 2-tuples, they come and go, so the memory
    use won't grow.  Adjust the code as needed to achieve
    canonicalization before iterating.<br>
    <br>
    Or maybe I am misunderstanding the requirements?</div></blockquote><div><br></div><div>This is better than solutions like <a href="http://stackoverflow.com/a/27952689/161642" target="_blank">http://stackoverflow.com/a/<wbr>27952689/161642</a> in the sense that it's a little higher level (no bit shifting or magic numbers).</div><div><br></div><div>But it's not clear that it's any better in the sense that you're still rolling your own incremental hash algorithm out of a lower-level primitive that doesn't document support for this, and therefore taking responsibility yourself for how well it distributes values into buckets.</div><div><br></div><div>Are you confident this results in good hash performance? Is this better than a solution built on top of a hash function with an explicit API for calculating a hash incrementally, such as the crc32 example I included? (And again, this would ideally be a <span style="font-size:12.8px">sys.hash_info.hash_bits -bit algorithm.)</span></div><div><br></div><div>Don't we still probably want either:</div><div><br></div><div>1) Python to provide some such hash_stream() function as a built-in,</div><div><br></div><div>or failing that,</div><div><br></div><div>2) the <a href="https://docs.python.org/3/reference/datamodel.html#object.__hash__" target="_blank">https://docs.python.org/3/<wbr>reference/datamodel.html#<wbr>object.__hash__</a> documentation to bless this as the recommended solution to this problem, thereby providing assurance of its performance?</div><div><br></div><div>If that makes sense, I'd be happy to file an issue, and include the start of a patch providing either 1 or 2.</div><div><br></div><div>Thanks very much for the helpful response.</div></div></div></div>