staticlongstring_hash(PyStringObject*a){registerPy_ssize_tlen;registerunsignedchar*p;registerlongx;// cpython에서 string의 hash는 ob_hash에 저장해두는데, 항상 hash하는것이 아닌 값을 사용할때 hash한다.// -1은 기본값으로, hash가 이뤄지지 않았음을 의미한다.if(a->ob_shash!=-1)returna->ob_shash;len=Py_SIZE(a);// ob_sval은 실제 스트링이다.p=(unsignedchar*)a->ob_sval;x=*p<<7;while(--len>=0)x=(1000003*x)^*p++;x^=Py_SIZE(a);// hash의 결과로 -1이 나온경우 hash가 이뤄지지 않은 경우와 겹치므로, -2로 처리한다.if(x==-1)x=-2;a->ob_shash=x;returnx;}