กำลังคำนวณแฮช MD5 น้อยกว่า CPU ที่เข้มข้นกว่า SHA-1 หรือ SHA-2 บนฮาร์ดแวร์ x86 ของแล็ปท็อป "มาตรฐาน" หรือไม่ ฉันสนใจข้อมูลทั่วไปไม่เจาะจงชิปบางตัว
UPDATE: ในกรณีของฉันฉันสนใจที่จะคำนวณแฮชของไฟล์ หากขนาดไฟล์มีความสำคัญสมมติว่าเป็น 300K
กำลังคำนวณแฮช MD5 น้อยกว่า CPU ที่เข้มข้นกว่า SHA-1 หรือ SHA-2 บนฮาร์ดแวร์ x86 ของแล็ปท็อป "มาตรฐาน" หรือไม่ ฉันสนใจข้อมูลทั่วไปไม่เจาะจงชิปบางตัว
UPDATE: ในกรณีของฉันฉันสนใจที่จะคำนวณแฮชของไฟล์ หากขนาดไฟล์มีความสำคัญสมมติว่าเป็น 300K
คำตอบ:
ใช่ MD5 ค่อนข้างใช้ CPU น้อย ใน Intel x86 ของฉัน (Core2 Quad Q6600, 2.4 GHz โดยใช้หนึ่งคอร์) ฉันได้รับสิ่งนี้ในโหมด 32 บิต:
MD5 411
SHA-1 218
SHA-256 118
SHA-512 46
และสิ่งนี้ในโหมด 64 บิต:
MD5 407
SHA-1 312
SHA-256 148
SHA-512 189
ตัวเลขเป็นเมกะไบต์ต่อวินาทีสำหรับข้อความ "ยาว" (นี่คือสิ่งที่คุณจะได้รับสำหรับข้อความที่ยาวกว่า 8 กิโลไบต์) นี่คือsphlibซึ่งเป็นไลบรารีของการใช้ฟังก์ชันแฮชใน C (และ Java) การใช้งานทั้งหมดมาจากผู้เขียนคนเดียวกัน (ฉัน) และทำด้วยความพยายามเปรียบเทียบกันในการปรับให้เหมาะสม ดังนั้นความแตกต่างของความเร็วจึงถือได้ว่าเป็นฟังก์ชันที่อยู่ภายในจริงๆ
ในการเปรียบเทียบให้พิจารณาว่าฮาร์ดดิสก์รุ่นล่าสุดจะทำงานที่ประมาณ 100 MB / s และอะไรก็ตามที่อยู่บน USB จะต่ำกว่า 60 MB / s แม้ว่า SHA-256 จะปรากฏ "ช้า" ที่นี่ แต่ก็เร็วเพียงพอสำหรับวัตถุประสงค์ส่วนใหญ่
โปรดทราบว่าOpenSSLมีการใช้งาน SHA-512 แบบ 32 บิตซึ่งค่อนข้างเร็วกว่ารหัสของฉัน (แต่ไม่เร็วเท่า SHA-512 64 บิต) เนื่องจากการใช้งาน OpenSSL อยู่ในชุดประกอบและใช้การลงทะเบียน SSE2 ซึ่งเป็นสิ่งที่ไม่สามารถทำได้ ทำได้ในรูปแบบ C. SHA-512 เป็นฟังก์ชันเดียวในสี่ฟังก์ชันที่ได้รับประโยชน์จากการใช้งาน SSE2
แก้ไข:ในหน้านี้ (ที่เก็บถาวร ) คุณสามารถค้นหารายงานเกี่ยวกับความเร็วของฟังก์ชันแฮชจำนวนมากได้ (คลิกที่ลิงค์ "Telechargez maintenant") รายงานเป็นภาษาฝรั่งเศส แต่ส่วนใหญ่เต็มไปด้วยตารางและตัวเลขและตัวเลขเป็นแบบสากล ฟังก์ชันแฮชที่ใช้งานไม่ได้รวมผู้สมัคร SHA-3 (ยกเว้น SHABAL) แต่ฉันกำลังดำเนินการอยู่
ใน MacBook Air ปี 2012 ของฉัน (Intel Core i5-3427U, 2x 1.8 GHz, 2.8 GHz Turbo) SHA-1 เร็วกว่า MD5 เล็กน้อย (โดยใช้ OpenSSL ในโหมด 64 บิต):
$ openssl speed md5 sha1
OpenSSL 0.9.8r 8 Feb 2011
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 30055.02k 94158.96k 219602.97k 329008.21k 384150.47k
sha1 31261.12k 95676.48k 224357.36k 332756.21k 396864.62k
อัปเดต: 10 เดือนต่อมากับ OS X 10.9 SHA-1 ทำงานช้าลงในเครื่องเดียวกัน:
$ openssl speed md5 sha1
OpenSSL 0.9.8y 5 Feb 2013
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 36277.35k 106558.04k 234680.17k 334469.33k 381756.70k
sha1 35453.52k 99530.85k 206635.24k 281695.48k 313881.86k
การอัปเดตครั้งที่สอง:บน OS X 10.10 ความเร็ว SHA-1 จะกลับไปที่ระดับ 10.8:
$ openssl speed md5 sha1
OpenSSL 0.9.8zc 15 Oct 2014
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 35391.50k 104905.27k 229872.93k 330506.91k 382791.75k
sha1 38054.09k 110332.44k 238198.72k 340007.12k 387137.77k
การอัปเดตครั้งที่สาม: OS X 10.14 พร้อม LibreSSL เร็วกว่ามาก (ยังอยู่ในเครื่องเดียวกัน) SHA-1 ยังคงออกมาด้านบน:
$ openssl speed md5 sha1
LibreSSL 2.6.5
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 43128.00k 131797.91k 304661.16k 453120.00k 526789.29k
sha1 55598.35k 157916.03k 343214.08k 489092.34k 570668.37k
คำตอบที่แท้จริงคือมันขึ้นอยู่กับ
มีปัจจัยสองสามประการที่ต้องพิจารณาที่ชัดเจนที่สุด ได้แก่ ซีพียูที่คุณใช้งานอัลกอริทึมเหล่านี้และการใช้อัลกอริทึม
ตัวอย่างเช่นฉันและเพื่อนของฉันทั้งคู่ใช้ openssl เวอร์ชันเดียวกันและได้ผลลัพธ์ที่แตกต่างกันเล็กน้อยกับซีพียู Intel Core i7 ที่แตกต่างกัน
การทดสอบของฉันในการทำงานกับ Intel (R) Core (TM) i7-2600 CPU @ 3.40GHz
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 64257.97k 187370.26k 406435.07k 576544.43k 649827.67k
sha1 73225.75k 202701.20k 432679.68k 601140.57k 679900.50k
และเขาใช้ Intel (R) Core (TM) i7 CPU 920 @ 2.67GHz
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 51859.12k 156255.78k 350252.00k 513141.73k 590701.52k
sha1 56492.56k 156300.76k 328688.76k 452450.92k 508625.68k
เราทั้งคู่ใช้งานไบนารีเดียวกันของ OpenSSL 1.0.1j 15 ต.ค. 2014 จากแพ็คเกจอย่างเป็นทางการของ ArchLinux
ความคิดเห็นของฉันเกี่ยวกับเรื่องนี้คือด้วยความปลอดภัยที่เพิ่มขึ้นของ sha1 นักออกแบบ cpu มีแนวโน้มที่จะปรับปรุงความเร็วของ sha1 และโปรแกรมเมอร์จำนวนมากจะทำงานกับการเพิ่มประสิทธิภาพของอัลกอริทึมมากกว่า md5sum
ฉันเดาว่า md5 จะไม่ถูกใช้อีกต่อไปในบางวันเนื่องจากดูเหมือนว่าจะไม่มีข้อได้เปรียบเหนือ sha1 ฉันยังทดสอบบางกรณีในไฟล์จริงและผลลัพธ์ก็เหมือนกันเสมอในทั้งสองกรณี (อาจถูก จำกัด โดยดิสก์ I / O)
md5sum ของไฟล์ขนาดใหญ่ 4.6GB ใช้เวลาเดียวกันกับ sha1sum ของไฟล์เดียวกันเช่นเดียวกันกับไฟล์ขนาดเล็กจำนวนมาก (488 ในไดเร็กทอรีเดียวกัน) ฉันทำการทดสอบหลายสิบครั้งและพวกเขาก็ได้รับผลลัพธ์เดียวกันอย่างสม่ำเสมอ
-
มันน่าสนใจมากที่จะตรวจสอบเรื่องนี้ต่อไป ฉันเดาว่ามีผู้เชี่ยวชาญบางคนที่สามารถให้คำตอบที่ชัดเจนว่าทำไม sha1 ถึงเร็วกว่า md5 ในโปรเซสเซอร์รุ่นใหม่ ๆ
openssl speed
ทำซึ่งเป็นเกณฑ์มาตรฐานแรกและมีความหมายที่สุด
MD5 ยังได้รับประโยชน์จากการใช้งาน SSE2 ตรวจสอบ BarsWF แล้วบอกฉันว่าไม่ สิ่งที่ต้องทำคือความรู้เกี่ยวกับแอสเซมเบลอร์เพียงเล็กน้อยและคุณสามารถสร้างรูทีน MD5 SSE2 ของคุณเองได้ อย่างไรก็ตามสำหรับปริมาณงานจำนวนมากจะมีการแลกเปลี่ยนความเร็วระหว่างการแฮชเมื่อเทียบกับเวลาที่ใช้ในการจัดเรียงข้อมูลอินพุตใหม่เพื่อให้เข้ากันได้กับคำแนะนำ SIMD ที่ใช้
sha1sum ค่อนข้างเร็วบน Power9 มากกว่า md5sum
$ uname -mov
#1 SMP Mon May 13 12:16:08 EDT 2019 ppc64le GNU/Linux
$ cat /proc/cpuinfo
processor : 0
cpu : POWER9, altivec supported
clock : 2166.000000MHz
revision : 2.2 (pvr 004e 1202)
$ ls -l linux-master.tar
-rw-rw-r-- 1 x x 829685760 Jan 29 14:30 linux-master.tar
$ time sha1sum linux-master.tar
10fbf911e254c4fe8e5eb2e605c6c02d29a88563 linux-master.tar
real 0m1.685s
user 0m1.528s
sys 0m0.156s
$ time md5sum linux-master.tar
d476375abacda064ae437a683c537ec4 linux-master.tar
real 0m2.942s
user 0m2.806s
sys 0m0.136s
$ time sum linux-master.tar
36928 810240
real 0m2.186s
user 0m1.917s
sys 0m0.268s