The first programs I wrote when looking into Go were solutions to the first two Project Euler problems and a port of the Kember Identity search program. I decided to skip the Euler problems this time and go straight to the Kember Identity port.
The Kember program ultimately boils down to generating and checking MD5 hashes. I didn't find any helpful cryptography related objects or methods in the default image, so I searched Google and eventually found Ron Teitelbaum's Cryptography/Team package. Squeak uses a package management system called Monticello to load code into the image, so getting and installing the package was pretty easy. I copied and pasted the package repository's connection information into the Monticello Browser and loaded Rob Withers' contribution, Cryptography-rww.15.mcz.
Once the package was loaded, I was able to obtain hashes with
Kember » md5: aString
"return 32-char MD5 hash of the given text"
| hash str |
hash := MD5 new
hashStream: (ReadStream on: aString).
str := ''.
1 to: hash size do: [:i |
str := str, ((hash at: i) radix: 16)].
↑ str.… only to find out later that objects of the ByteArray class were modified by the cryptography package to accept a hex message and will do the conversion for me. Oops! All the bit twiddling I had done could easily be replaced with:↑ (MD5 new hashStream: (ReadStream on: aString)) hex.Converting between hash representations wasn't the only part of the program I initially over-programmed. I was also doing long-form addition to obtain the next hash value in the sequence when all I really needed was a little bit of type juggling and string padding:
Kember » nextHash: aHashStr
"increment the MD5 hash"
| hexHash zeroes |
zeroes = '00000000000000000000000000000000'.
hexHash := ((ByteArray fromHexString: aHashStr)
asInteger + 1) asByteArray hex.
hexHash size < 32
ifTrue: [↑ (zeroes copyFrom: 1 to 32 - hexHash size)
, hexHash].
↑ hexHash.
I guess it just proves the saying is true, "learning the libraries is the 20% of learning a new language that takes 80% of the time and effort." If anything, at least I can take comfort in knowing I'm not the first person to over-program a solution while learning a new language.
For those that want to check out my Kember code, I've set up my own repository and uploaded a Monticello package to SqueakSource, and a file dump to Github (I suggest looking at it in raw mode if you go to Github because their Markdown chokes and truncates the pretty-print view).
No comments:
Post a Comment