Last active
August 29, 2015 13:56
-
-
Save tyano/8913549 to your computer and use it in GitHub Desktop.
MD5ハッシュ突き合わせ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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))))))) |
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
https://gist.github.com/athos/8910441 の手法を参考に、DatatypeConverterの利用と、MessageDigestオブジェクトの使い回しを採用。findPassword部分はmap, filterではなく、loopに変更。core i5/2.4GHzで750msくらい。