Skip to content

Instantly share code, notes, and snippets.

@tyano
Last active August 29, 2015 13:56
Show Gist options
  • Save tyano/8913549 to your computer and use it in GitHub Desktop.
Save tyano/8913549 to your computer and use it in GitHub Desktop.
MD5ハッシュ突き合わせ
(ns mdsample.core
(:require [clojure.core.reducers :as r])
(:import [java.security MessageDigest]
[javax.xml.bind DatatypeConverter]
[java.util Arrays]))
(def ^MessageDigest digester (MessageDigest/getInstance "MD5"))
(defn- hexdigest
[^String s]
(let [d (doto digester
(.reset)
(.update (.getBytes s)))]
(.digest d)))
(defn- left-pad [^long num]
(let [pad-count (- 6 (count (str num)))]
(str (apply str (repeat pad-count \0)) num)))
(defn find-password [salt pw]
(let [pw ^bytes (DatatypeConverter/parseHexBinary pw)]
(loop [i (long 0) ret nil]
(if (or (> i (long 1000000)) ret)
ret
(let [six-num (left-pad i)
hex ^bytes (hexdigest (str salt "$" six-num))]
(if (Arrays/equals pw hex)
(recur (inc i) [six-num (DatatypeConverter/printHexBinary hex)])
(recur (inc i) ret)))))))
@tyano
Copy link
Author

tyano commented Feb 10, 2014

https://gist.github.com/athos/8910441 の手法を参考に、DatatypeConverterの利用と、MessageDigestオブジェクトの使い回しを採用。findPassword部分はmap, filterではなく、loopに変更。core i5/2.4GHzで750msくらい。

@tyano
Copy link
Author

tyano commented Feb 10, 2014

https://gist.github.com/backpaper0/8916116
にて、わざわざ文字列にしないでバイト配列のまま比較したほうがもっと速い、という指摘を受け、文字列生成をやめてバイトのまま比較するように変更した。
core i5/2.4GHz で600から650msくらいになった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment