[Gauche-devel-jp] digest

Back to archive index

Kimura Fuyuki fuyuk****@hadal*****
2002年 12月 12日 (木) 09:38:32 JST


At Tue, 10 Dec 2002 17:32:39 -1000 (HST),
Shiro Kawai <shiro****@lava*****> wrote:
> 
> ところで、util.digest, rfc.md5, rfc.sha1, rfc.hmacに関して
> マニュアルの整備とAPIの整理を行いました。特に、
> {md5|sha1}-{update!|final!} はexternal interfaceから
> 落しちゃったんですが、問題ありそうならお知らせ下さい。

問題ないと思います。dbm の真似をして低レベルのものも出しておいただけで、
実際に必要になることはまずないでしょう。

ただ、マニュアルにひとつ事実誤認があって、digest 系関数も 
digest-string 系と同様結果は string で返します(port に出力でなく)。実
はここは私も迷ったところなので、マニュアルにコードを合わせてしまったほ
うがいかもしれません。

それと、digest-string の実装は digest.scm のなかに移してしまったほうが
すっきりすると思います(添付参照)。自分でもなんで今のように書いたのかお
ぼえていません。まさかディスパッチ1回ケチった??

*

At Fri, 15 Nov 2002 11:52:36 +0900,
Kimura Fuyuki <fuyuk****@hadal*****> wrote:
> 
> Open issue:
> 
> - Hexify. How and where?

の問題に個人的な結論が出ているのでついでに書いておきます。こういう用途
やバイナリファイル操作のために Perl のpack/unpack みたいのがあればいい
なあとも思っていて、それはいまでも変わらないのですが、Scheme の場合ま
ず必要なのは「read/write のペアたくさん」です。

<例1> Oleg Kiselyov's "Binary I/O and applications"

http://okmij.org/ftp/Scheme/index.html#binio

<例2> pack=write, unpack=read の対応がわかりやすいように書いた例

;; anaphoric if eof -- adopted from common-macros.scm
(define-macro (aifeof test then . else)
  `(let ((_ ,test)) (if (eof-object? _) ,then , @ else)))

;; unpack "H2"
;; reads from current-input-port, returns the unpacked value
(define (read-hex) (aifeof (read-byte) _ (format "~2,'0x" _)))

;; perl -e 'print unpack("H*", "abc"),"\n";'
(print (with-string-io "abc" (lambda() (port-for-each display read-hex))))

対応関係からするとたしかにこういうことになるのですが、read-hex がこう
いう動作をするとはちょっと想像がつきにくいという欠点があります。このへ
んは当面 digest-hexify みたいな感じでやっておくとして、まずは Endian
I/O のような API を増やしていくのがいいのではないかと思います。

-- 
木村 冬樹
-------------- next part --------------
Index: ext/digest/md5.scm
===================================================================
RCS file: /cvsroot/gauche/Gauche/ext/digest/md5.scm,v
retrieving revision 1.4
diff -u -r1.4 md5.scm
--- ext/digest/md5.scm	11 Dec 2002 03:09:26 -0000	1.4
+++ ext/digest/md5.scm	12 Dec 2002 00:25:26 -0000
@@ -52,7 +52,5 @@
   (%md5-final (context-of self)))
 (define-method digest ((class <md5-meta>))
   (md5-digest))
-(define-method digest-string ((class <md5-meta>) string)
-  (md5-digest-string string))
 
 (provide "rfc/md5")
Index: ext/digest/sha1.scm
===================================================================
RCS file: /cvsroot/gauche/Gauche/ext/digest/sha1.scm,v
retrieving revision 1.3
diff -u -r1.3 sha1.scm
--- ext/digest/sha1.scm	11 Dec 2002 03:09:26 -0000	1.3
+++ ext/digest/sha1.scm	12 Dec 2002 00:25:26 -0000
@@ -51,7 +51,5 @@
   (%sha1-final (context-of self)))
 (define-method digest ((class <sha1-meta>))
   (sha1-digest))
-(define-method digest-string ((class <sha1-meta>) string)
-  (sha1-digest-string string))
 
 (provide "rfc/sha1")
Index: lib/util/digest.scm
===================================================================
RCS file: /cvsroot/gauche/Gauche/lib/util/digest.scm,v
retrieving revision 1.4
diff -u -r1.4 digest.scm
--- lib/util/digest.scm	11 Dec 2002 03:09:26 -0000	1.4
+++ lib/util/digest.scm	12 Dec 2002 00:25:26 -0000
@@ -40,7 +40,7 @@
 (define-method digest ((class <message-digest-algorithm-meta>))
   #f)
 (define-method digest-string ((class <message-digest-algorithm-meta>) string)
-  #f)
+  (with-input-from-string string (lambda () (digest class))))
 
 ;; utility
 (define (digest-hexify string)


Gauche-devel-jp メーリングリストの案内
Back to archive index