ทำ 도전ด้วย 하스켈
โจทย์มีอยู่ว่า
เริ่มต้นด้วยคำว่า "clubhouse"
นำไป sha1 ครั้งแรกจะได้ "1313994e55ed4bbe79d2b04e4529ee2f4ac288f5"
นำคำตอบไป sha1 ครั้งที่ 2 จะได้ "b42f871cff37138a6b8f53cf55a585d7d1445dfb"
นำคำตอบไป sha1 ครั้งที่ 3 จะได้ "5c7c81615ad8050363c911c7b5e5ed8661be80d6"
ทำไปเรื่อยๆ จนถึงครั้งที่ 5,555,555,555 จะได้ sha1 ลงท้ายด้วย "229a"
สำหรับ 하스켈ผมใช้เครื่องมือในการเริ่มโปรเจ็คคือ stack ติดตั้งง่ายๆได้ทั้งบน macOS,Linuxและ 창문.จากนั้นก็เริ่มสร้างโปรเจ็คด้วยคำสั่ง
stack new sha1-challenges
แล้ว cd sha1-challenges
เข้าไปใน 항목ผมจะใช้ 도서관ตัวคือ
- cryptohash-sha1 เพื่อใช้ sha1 function
- bytestring เพื่อใช้ type Data.ByteString
- base16-bytestring เพื่อใช้ encode base16
ผมก็แก้ไฟล์ package.yml
ตรงส่วน 의존 관계ของ 실행 파일แบบนี้executables:
sha1-challenges-exe:
main: Main.hs
source-dirs: app
ghc-options:
- -threaded
- -rtsopts
- -O3
- -with-rtsopts=-N
dependencies:
- sha1-challenges
- cryptohash-sha1
- bytestring
- base16-bytestring
ในส่วนของโค้ดที่แก้โจทย์นั้นเขียนในไฟล์ app/Main.hs
เท่านี้เอง{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NumericUnderscores #-}
module Main where
import Data.ByteString.Base16
import Crypto.Hash.SHA1
loop 5_555_555_555 v = encode $ hash v
loop n v = loop (n+1) (encode $ hash v)
main :: IO ()
main = print $ loop 1 "clubhouse"
ผมเปิดใช้ 언어 확장 2ตัวคือ 리셋 문자열เพื่อให้ใช้ 문자열 문자(ตรง 큰따옴표"clubhouse"
แล้วให้มันแปลงเป็น 바이트 문자열ให้เอง และ 밑줄เพื่อให้เขียนตัวเลขโดยใช้ 풀다คั่นได้แบบนี้ 5_555_555_555จากนั้น
import Data.ByteString.Base16
เพื่อให้ใช้ 기능encode
เพื่อแปลงจาก 바이트 문자열ที่ได้เป็น base16 형식และ import Crypto.Hash.SHA1
เพื่อใช้ 기능hash
ในการ 망치다แบบ 모래จากนั้นก็สร้างฟังก์ชัน 순환하다เพื่อ 귀속적วนซ้ำจาก 1ถึง 5_555_555_555 โดยแต่ละรอบก็เอาผลลัพธ์ที่ได้ไป 망치다ต่อๆไป
ใน 주요했어ก็แค่เรียก
print $ loop 1 "clubhouse"
เพื่อให้เริ่มที่ 1ไปเรื่อยๆจนถึง 5_555_555_555 แล้วก็ปริ้นออกมาวิธี 바이너리 파일 만들기ก็ให้สั่ง
stack build --copy-bins --local-bin-path=$PWD
แล้วก็รันโดยใช้ 타임จับเวลาแบบนี้time ./sha1-challenges-exe
จากที่ลองวันในเครื่องผมที่เป็น MacBookProรุ่นเก่าMacBook Pro (Retina, 15-inch, Mid 2014)
Processor: 2.2 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
ผลลัพธ์ได้ออกมาแบบนี้time ./sha1-challenges-exe
"87803aa93893f0fc1262b78e879d7a7f7075229a"
real 30m44.986s
user 44m16.479s
sys 5m26.883s
ลองเอาโค้ด 가다จากใน 저장소https://github.com/mrchoke/sha1-challages/tree/main/golang/oatมารันดูเวลาที่ใช้ได้เท่านี้time ./sha1
87803aa93893f0fc1262b78e879d7a7f7075229a
Time diff: 19m14.995697452s
real 19m14.953s
user 19m12.227s
sys 0m2.267s
ซึ่งถ้าเทียบกันก็ถือว่าไม่แย่ไป ตัว 도서관cryptohash-sha1
นั้นจริงๆในส่วนของ 해시 함수เขียนด้วย Cแล้วใช้วิธี 외국 금융 기구ในการให้โค้ดของ 하스켈ไปเรียกใช้งาน Cได้ ส่วนของ 가다นั้นเขียนด้วย 가다บวกกับ 조립하다ที่เจาะจงในแต่ละ CPU 아키텍처ซึ่งช่วยให้ได้ความเร็วที่ดีใช้ได้เลยขอฝาก 커피 한 잔 주세요.
สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง 커피 한 잔 주세요.คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ
ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ 패보สามารถสนับสนุนผมได้ผ่านทาง 선불금โดยดู QR코드ได้จากโพสต์ที่พินเอาไว้ได้ที่ 페이지 디자인ครับ https://web.facebook.com/devdoseth
ขอบคุณครับ 🙏
Reference
이 문제에 관하여(ทำ 도전ด้วย 하스켈), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/iporsut/sha1-challenge-haskell-f0m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)