Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:49:16

0001 /**
0002 sdigest_test.cc
0003 =================
0004 
0005 ~/o/sysrap/tests/sdigest_test.sh
0006 
0007 
0008 When comparing with digests from files beware of the newline::
0009 
0010     epsilon:tests blyth$ printf "hello" > /tmp/hello  # echo includes newline
0011     epsilon:tests blyth$ cat /tmp/hello
0012     helloepsilon:tests blyth$
0013 
0014     epsilon:tests blyth$ md5 /tmp/hello
0015     MD5 (/tmp/hello) = 5d41402abc4b2a76b9719d911017c592
0016     epsilon:tests blyth$
0017 
0018     epsilon:tests blyth$ md5 -q -s hello
0019     5d41402abc4b2a76b9719d911017c592
0020 
0021 ::
0022 
0023     epsilon:tests blyth$ name=sdigest_test ; gcc $name.cc -std=c++11 -lstdc++ -I.. -o /tmp/$name && /tmp/$name
0024      i   0 : 5d41402abc4b2a76b9719d911017c592
0025      i   1 : 5d41402abc4b2a76b9719d911017c592
0026      i   2 : 5d41402abc4b2a76b9719d911017c592
0027      i   3 : 5d41402abc4b2a76b9719d911017c592
0028 
0029 
0030 ::
0031 
0032     In [6]: import hashlib
0033     In [7]: hashlib.md5(b"hello").hexdigest()
0034     Out[7]: '5d41402abc4b2a76b9719d911017c592'
0035 
0036     In [12]: a = np.array(b"hello", dtype="|S5" )
0037     In [13]: a.data
0038     Out[13]: <memory at 0x16ab67d60>
0039     In [14]: hashlib.md5(a.data).hexdigest()
0040     Out[14]: '5d41402abc4b2a76b9719d911017c592'
0041 
0042     In [15]: a2 = np.array([b"hello", b"world"], dtype="|S5" )
0043     In [16]: a2
0044     Out[16]: array([b'hello', b'world'], dtype='|S5')
0045     In [17]: a2[0].data
0046     Out[17]: <memory at 0x16aaddef0>
0047     In [18]: hashlib.md5(a2[0].data).hexdigest()
0048     Out[18]: '5d41402abc4b2a76b9719d911017c592'
0049 
0050 **/
0051 
0052 #include <cassert>
0053 #include <vector>
0054 #include <string>
0055 #include <iostream>
0056 #include <iomanip>
0057 
0058 #include "sdigest.h"
0059 #include "ssys.h"
0060 #include "sstr.h"
0061 
0062 
0063 struct sdigest_test
0064 {
0065     static int compare(const char* label, const std::vector<std::string>& dig, const char* known=nullptr );
0066     static int hello();
0067     static int int_();
0068     static int Desc();
0069     static int Hit();
0070 
0071     static int main();
0072 
0073 };
0074 
0075 int sdigest_test::compare(const char* label, const std::vector<std::string>& dig, const char* known )
0076 {
0077     std::cout << "sdigest_test::compare " << label << "\n" ;
0078     int rc = 0 ;
0079     for(unsigned i=0 ; i < dig.size() ; i++)
0080     {
0081         std::cout
0082             << " i " << std::setw(3) << i
0083             << " : " << dig[i]
0084             << std::endl
0085             ;
0086 
0087         bool match_0i = strcmp( dig[0].c_str(), dig[i].c_str() ) == 0 ;
0088         bool match_ki = known ? strcmp(known, dig[i].c_str()) == 0 : true ;
0089 
0090         if(!match_0i) rc += 1 ;
0091         if(!match_ki) rc += 1 ;
0092     }
0093     return rc ;
0094 }
0095 
0096 
0097 int sdigest_test::hello()
0098 {
0099     char dat[6] ;
0100     dat[0] = 'h' ;
0101     dat[1] = 'e' ;
0102     dat[2] = 'l' ;
0103     dat[3] = 'l' ;
0104     dat[4] = 'o' ;
0105     dat[5] = '\0' ;
0106 
0107     const char* m = "hello" ;
0108     const char* hello_digest = "5d41402abc4b2a76b9719d911017c592" ;
0109 
0110     std::string msg = "hello" ;
0111 
0112     std::stringstream ss ;
0113 #ifdef __APPLE__
0114     ss << "md5 -q -s " << m ;
0115 #else
0116     ss << "echo " << hello_digest ;
0117     // kludge as Linux equivalent "echo -n hello | md5sum" needs a pipe
0118 #endif
0119     std::string cmd = ss.str();
0120 
0121     std::vector<std::string> dig(10) ;
0122 
0123     dig[0] = sdigest::Buf( dat, 5 );         // null terminator not included
0124     dig[1] = sdigest::Buf( m , strlen(m) );  // strlen does not count terminator
0125     dig[2] = sdigest::Buf( msg.c_str(), strlen(msg.c_str()) );
0126     dig[3] = ssys::popen( cmd.c_str() );
0127 
0128 
0129     sdigest u0, u1, u2, u3, u4 ;
0130 
0131     u0.add(m);
0132     u1.add(msg);
0133     u2.add(dat, 5);
0134     for(int i=0 ; i < 5 ; i++) u3.add(dat+i, 1 );  // adding character by character
0135 
0136     u4.add_<char>(dat, 5 );
0137 
0138 
0139     dig[4] = u0.finalize();
0140     dig[5] = u1.finalize();
0141     dig[6] = u2.finalize();
0142     dig[7] = u3.finalize();
0143     dig[8] = u4.finalize();
0144 
0145 
0146     const char* path = "/tmp/hello.txt" ;
0147     sstr::Write(path, m );
0148     dig[9] = sdigest::Path(path) ;
0149 
0150     return compare("hello", dig, hello_digest );
0151 }
0152 
0153 int sdigest_test::int_()
0154 {
0155     sdigest u0 ;
0156     u0.add(0);
0157     u0.add(1);
0158     u0.add(2);
0159     u0.add(3);
0160 
0161     std::vector<int> ii = {{ 0,1,2,3 }} ;
0162     sdigest u1 ;
0163     u1.add( (char*)ii.data(), sizeof(int)*ii.size() );
0164 
0165 
0166     std::vector<std::string> dig(2) ;
0167     dig[0] = u0.finalize() ;
0168     dig[1] = u1.finalize() ;
0169 
0170     return compare("int_", dig);
0171 }
0172 
0173 int sdigest_test::Desc()
0174 {
0175     std::cout << "sdigest::Desc() " << sdigest::Desc() << std::endl ;
0176     return 0 ;
0177 }
0178 
0179 int sdigest_test::Hit()
0180 {
0181     NP* hit = NP::Load("$HITFOLD/hit.npy");
0182     std::cout << " hit " << ( hit ? hit->sstr() : "-" ) << "\n" ;
0183     if(hit == nullptr) return 0;
0184 
0185     for(int i=0 ; i < 10 ; i++)
0186     {
0187         std::string dig = sdigest::Item(hit, i );
0188         std::cout << std::setw(6) << i << " : " << dig << "\n" ;
0189     }
0190 
0191     return 0 ;
0192 }
0193 
0194 
0195 
0196 int sdigest_test::main()
0197 {
0198     const char* TEST = ssys::getenvvar("TEST", "ALL");
0199     bool ALL = strcmp(TEST, "ALL") == 0 ;
0200 
0201     int rc = 0 ;
0202     if(ALL||strcmp(TEST, "hello")==0) rc += hello();
0203     if(ALL||strcmp(TEST, "int_")==0)  rc += int_();
0204     if(ALL||strcmp(TEST, "Desc")==0)  rc += Desc();
0205     if(ALL||strcmp(TEST, "Hit")==0)   rc += Hit();
0206 
0207     std::cout << "sdigest_test::main rc:" << rc << "\n" ;
0208     return rc ;
0209 }
0210 
0211 int main(){ return sdigest_test::main() ; }