Underconstruction by Taiyo このページをアンテナに追加 RSSフィード

6th. July. 2009

flic.kr で使われている base58 のデコードを行う javascript のコード

http://www.flickr.com/groups/api/discuss/72157616713786392/php を参考に作ってみた javascript です。

pbtweet で flic.kr の URL をデコードするために使っています。

function base58_decode( snipcode )
 {
	var alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' ;
	var num = snipcode.length ;
	var decoded = 0 ;
	var multi = 1 ;
	for ( var i = (num-1) ; i >= 0 ; i-- )
	{
		decoded = decoded + multi * alphabet.indexOf( snipcode[i] ) ;
		multi = multi * alphabet.length ;
	}
	return decoded;
}

だれかがもうどこかに公開してるんだろうけど情弱なんで見つけきれなかったよorz...

っていうか、こんなのデコードするのに for 使うとか頭悪すぎるような気がしてきたけど、とりあえず動くんで晒してます。歳食ってからプログラムなんて始めるもんじゃないなぁ。

xddxdd 2009/07/07 13:12 String.prototype.decode_base58 = function() {
var alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' ;
var decoded = 0;

function decode(element, index, array) {
decoded += alphabet.indexOf(element) * Math.pow(58, array.length-(index+1));
}

this.split("").forEach(decode);

return decoded;
}

javascriptはいまいち判りません。。。

t_tracet_trace 2009/07/07 13:22 感謝!

xddxdd 2009/07/07 18:12 firefoxのjsのdoc読んでいたら、JavaScript 1.8からサポートのarrayでreduceというのがあって
safari 4でも動いたので、decodedを削除

String.prototype.decode_base58 = function() {
return this.split("").reduce( function(previousValue, currentValue, index, array){
var alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';

return previousValue + alphabet.indexOf(currentValue) * Math.pow(58, array.length-(index+1));
}, 0);
}
alphabetをどうにかしたいですね。
いまいち。

t_tracet_trace 2009/07/07 19:45 firefoxのjsのdoc読んでいたら、JavaScript 1.8からサポートのarrayでreduceというのがあって
safari 4でも動いたので、decodedを削除

String.prototype.decode_base58 = function()
{
    return this.split("").reduce( function(previousValue, currentValue, index, array)
    {
        var alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';

        return previousValue + alphabet.indexOf(currentValue) * Math.pow(58, array.length-(index+1));
    }, 0);
}

t_tracet_trace 2009/07/07 19:46 ちょっと成形してみた。option+space でインデント入るよ。
しかしすごいなぁ。

xddxdd 2009/07/08 10:17 base58_decodeがあるのにencodeは?って事で書きました。

function base58_encode( n ) {
 var alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' ;
 var result = '';
 while ( n >= 58 ) {
  var remainder = n % 58;
   n = n / 58;
   result = alphabet.charAt(remainder) + result;
 }
 if( n ) result = alphabet.charAt(n) + result;

 return result;
}

ちなみに先生の大好きな再帰を使用すると

function base58_encode( n ) {
 var res = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'.charAt(n % 58);
 if( n >= 58 ) res = base58_encode( n / 58 ) + res;
 return res;
}

あまりテストはしていませんのでバグあるかも。

otsuneotsune 2009/07/10 04:08 http://github.com/dougal/base58/blob/master/lib/base58.rb

Rubygemのbase58を見ると結構シンプルに書けるんだなぁ

t_tracet_trace 2009/07/10 15:28 ありがとうございます。 Rubyも面白そう。

matarillomatarillo 2009/07/29 01:54 rubyの真似するなら

String.prototype.decode_base58 = (function(){
  var alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
  var base = alphabet.length;
  var each_with_index = function(a, f){
    for (var i = 0; i < a.length; i++) f(i, a[i]);
  }
  return function(){
    var int_val = 0;
    each_with_index(this.split('').reverse(), function(index, char){
      int_val += (alphabet.indexOf(char)) * Math.pow(base, index)
    });
    return int_val;
  }
})();

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/t_trace/20090706/p1
taiyofj. Get yours at bighugelabs.com/flickr