<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>TL;DR<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I want to take a python data structure (see later for details) and represent it in a format that will be stable across python versions, and platforms so that I can construct a stable hash. I’m looking for pointers to some best practices on how to do this.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The longer version<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Assume that there’s some function in python that is:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>def fn(*args, **kwargs):<o:p></o:p></p><p class=MsoNormal>    …<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’d like to take (args, kwargs) and construct a hash of some representation that is deterministic. Specifically, assume that fn() is a method in the API (oslo.messaging transport …). I’d like to construct the hash on the sender side and on the RPC server side and make sure that the parameters are the same.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So, just before calling call() or cast(), I could compute the hash and stuff it into the dictionary that is being sent over, and I can do the same on the receiving side. But since I cannot guarantee that the representation on the receiving side is necessarily identical to the representation on the sending side, I have issues computing the hash.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In IRC, jroll suggested json; can one safely assume that json.dumps() is a deterministic representation?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks for any pointers and suggestions.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-amrith<o:p></o:p></p></div></body></html>