2011-12-05 3 views
1

私は画像のURL(最初の2文字のMD5)を取得 にDBpediaの者extraction_framework(ImageExtractor#getImageUrl)を使用していウィキペディアは画像パスのハッシュ部分を計算するためにさまざまな方法を使用しますか?

val md = MessageDigest.getInstance("MD5") 
    val messageDigest = md.digest(fileName.getBytes) 
    val md5 = (new BigInteger(1, messageDigest)).toString(16) 

    val hash1 = md5.substring(0, 1) 
    val hash2 = md5.substring(0, 2); 

    val urlPart = hash1 + "/" + hash2 + "/" + fileName 

ほとんどの時間、機能が正常に動作しますが、いくつかの例、それ が正しくありません: "Stewie_Griffin.png" については

、私は2月26日/ Stewie_Griffin.png得るが、実際 1は、ソー​​スファイル情報はこちら0/02/Stewie_Griffin.png

です: http://en.wikipedia.org/wiki/File:Stewie_Griffin.png http://upload.wikimedia.org/wikipedia/en/0/02/Stewie_Griffin.png

ハッシュ方式は時々動作しない理由を任意のアイデア?

答えて

1

OQ's response to your question on the MediaWiki API mailing listは、右のようだ:

val md5 = (new BigInteger(1, messageDigest)).toString(16) 

あなたがBigInt型に変換しているときには、先行ゼロを食べています。 なぜ、私の知る限りのMessageDigestは(toStringメソッドを提供していたときにわからない)

+0

先行ゼロが食べられているときのおかげで、ここでの修正です:valのMD5 =(result.length%2!= 0) "0" +は、他の結果 –

+0

を引き起こす場合、私はorg.apache.commonsを使用することをお勧めします。 codec.digest.DigestUtils#md5Hex手動で計算するのではなく –

+1

@ tommy chheng md5にいくつかのリードがある場合は、 '0' –

0

ただ要約する:あなたはorg.apache.commons.codec.digest.DigestUtils#md5Hexを使用する必要があるWikipediaの画像へのパスを計算します:

String md5 = DigestUtils.md5Hex(image); 
System.out.println(md5.substring(0, 1) + "/" + md5.substring(0, 2) + "/" + image); 
関連する問題