標準拡張ライブラリ拡充計画第一弾。

 まずは、いちばん簡単と思われる ruby-sha1 から行きましょう。
外部のライブラリを必要とせず、プラットフォームにも依存しません。
(endian は extconf.rb で判別して対応しています)

	http://www.ruby-lang.org/en/raa-list.rhtml?name=ruby-sha1

 実はこれ、 MD5 モジュールとインターフェースが完全互換になって
いて、独自の拡張として update メソッドのエイリアスとして << が
定義されているというのが唯一の違いです。

 これは便利なので、 MD5 モジュールにも取り込んだ上でインポート
すればいい兄弟になるんじゃないでしょうか。SHA1 モジュールの日本語
マニュアルも、あとで MD5 からコピーすれば簡単に用意できます。


Class SHA1

	A class to implement the SHA1 Secure Hash Algorithm by NIST (the US'
	National Institute of Standards and Technology), described in FIPS PUB
	180-1.

Superclass: Object

Class Methods:

    new([str])
    sha1([str])

	Creates a new SHA1 object.  If a string argument is given, it
        is added to the object. (see update.)

Methods:

    clone

	Copies the SHA1 object.

    digest

	Returns the SHA1 hash of the added strings as a string of 20 bytes.

    hexdigest

	Returns the SHA1 hash of the added strings as a string of 40
	hexadecimal digits. This method is equal to:

	def hexdigest
	  ret = ''
	  digest.each_byte {|i| ret << sprintf('%02x', i) }
	  ret
	end

    update(str)
    << str

	Updates the SHA1 object with string str.  Repeated calls are
	equivalent to a single call with the concatenation of all the
	arguments, i.e. m.update(a); m.update(b) is equivalent to
	m.update(a+b) and m << a << b is equivalent to m << a+b.


 MD5 モジュールの修正を添付します。(ドキュメントも直しました。
パッチに日本語を含むので、当てる前に EUC に変換してください)


 それでは、レビューをよろしくお願いします。

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"Freeze this moment a little bit longer, make each impression
  a little bit stronger..  Experience slips away -- Time stand still"

Index: md5.txt
===================================================================
RCS file: /src/ruby/ext/md5/md5.txt,v
retrieving revision 1.3
diff -u -r1.3 md5.txt
--- md5.txt	2000/06/22 08:29:56	1.3
+++ md5.txt	2001/05/08 14:00:19
@@ -12,23 +12,24 @@
    new([str])
    md5([str])
 
-	creates a new MD5 object.  If a string argument is given, it
+	Creates a new MD5 object.  If a string argument is given, it
         is added to the object. (see update.)
 
 Methods:
 
    clone
 
-	copies the MD5 object.
+	Copies the MD5 object.
 
    digest
 
-	returns have value of the added strings as a 16 bytes string.
+	Returns the MD5 hash of the added strings as a string of 16
+	bytes.
 
    hexdigest
 
-	returns have value of the added strings as an 32 bytes ASCII
-	string. This method is equal to:
+	Returns the MD5 hash of the added strings as a string of 32
+	hexadecimal digits.  This method is equal to:
 
 	def hexdigest
 	  ret = ''
@@ -37,11 +38,12 @@
 	end
 
    update(str)
+   << str
 
-	Update the MD5 object with the string.  Repeated calls are
+	Update the MD5 object with the string str.  Repeated calls are
 	equivalent to a single call with the concatenation of all the
 	arguments, i.e. m.update(a); m.update(b) is equivalent to
-	m.update(a+b).
+	m.update(a+b) and m << a << b is equivalent to m << a+b.
 
 -------------------------------------------------------
 Local variables:
Index: md5.txt.jp
===================================================================
RCS file: /src/ruby/ext/md5/md5.txt.jp,v
retrieving revision 1.3
diff -u -r1.3 md5.txt.jp
--- md5.txt.jp	2000/06/22 08:29:56	1.3
+++ md5.txt.jp	2001/05/08 14:00:19
@@ -3,7 +3,7 @@
 ** MD5(クラス)
 
 RFC1321に記述されているRSA Data Security, Inc. の MD5 Message-Digest
-Algorithmを実装するクラス.
+Algorithmを実装するクラス。
 
 SuperClass: Object
 
@@ -13,18 +13,18 @@
    md5([str])
 
         新しいMD5オブジェクトを生成する.文字列引数が与えられるとそれ
-        を追加する(see update).
+        を追加する(see update)。
 
 Methods:
 
    clone
 
-	MD5オブジェクトの複製を作る
+	MD5オブジェクトの複製を作る。
 
    digest
 
         今までに追加した文字列に対するハッシュ値を16バイト長の文字列で
-        返す.
+        返す。
 
    hexdigest
 
@@ -39,9 +39,12 @@
 	end
 
    update(str)
+   << str
 
         MD5オブジェクトに文字列を追加する。複数回updateを呼ぶことは文
-        字列を連結してupdateを呼ぶことと等しい.
+        字列を連結してupdateを呼ぶことと等しい。すなわち m.update(a);
+	m.update(b) は m.update(a+b) と、 m << a << b は m << a+b と
+	それぞれ等価である。
 
 -------------------------------------------------------
 Local variables:
Index: md5init.c
===================================================================
RCS file: /src/ruby/ext/md5/md5init.c,v
retrieving revision 1.8
diff -u -r1.8 md5init.c
--- md5init.c	2001/05/02 04:22:21	1.8
+++ md5init.c	2001/05/08 14:00:19
@@ -103,6 +103,7 @@
     rb_define_singleton_method(cMD5, "md5", md5i_new, -1);
 
     rb_define_method(cMD5, "update", md5i_update, 1);
+    rb_define_method(cMD5, "<<", md5i_update, 1);
     rb_define_method(cMD5, "digest", md5i_digest, 0);
     rb_define_method(cMD5, "hexdigest", md5i_hexdigest, 0);
     rb_define_method(cMD5, "clone",  md5i_clone, 0);