Băm nhanh nhất cho việc sử dụng phi mật mã?


154

Về cơ bản, tôi đang chuẩn bị các cụm từ để đưa vào cơ sở dữ liệu, chúng có thể không đúng định dạng nên tôi muốn lưu trữ một hàm băm ngắn trong số đó (tôi sẽ chỉ đơn giản là so sánh xem chúng có tồn tại hay không, vì vậy băm là lý tưởng).

Tôi giả sử MD5 khá chậm với hơn 100.000 yêu cầu vì vậy tôi muốn biết đâu là phương pháp tốt nhất để băm các cụm từ, có thể triển khai chức năng băm của riêng tôi hoặc sử dụng hash('md4', '...'sẽ nhanh hơn?

Tôi biết MySQL có MD5 (), do đó sẽ bổ sung một chút tốc độ vào cuối truy vấn, nhưng có lẽ còn có một hàm băm nhanh hơn trong MySQL Tôi không biết rằng nó sẽ hoạt động với PHP ..


6
Điều gì ngăn bạn khỏi điểm chuẩn băm?
NullUserException

3
NullUserException: Bạn nói đúng, tôi sẽ thử chúng với các cụm từ có độ dài ngẫu nhiên. Chỉ muốn cái nhìn sâu sắc về những gì sẽ là tiêu chuẩn nếu có để xử lý loại điều này.
John

5
MD5 không thực sự chậm đến thế ...
Amber

25
Bạn có chắc chắn rằng chức năng băm là một nút cổ chai của toàn bộ ứng dụng? Tôi nghi ngờ như vậy
Ý thức chung của bạn

4
Đây là một câu hỏi rất hay để hỏi, và các ý kiến ​​ngụ ý nó không, hoặc không quan trọng, và / hoặc nên rõ ràng và / hoặc trực quan - gây thất vọng và bực bội. (Và cũng không có gì bất ngờ.)
michael

Câu trả lời:


56

CRC32 khá nhanh và có chức năng cho nó: http://www.php.net/manual/en/feft.crc32.php

Nhưng bạn nên lưu ý rằng CRC32 sẽ có nhiều va chạm hơn so với băm MD5 hoặc thậm chí SHA-1, đơn giản là vì độ dài giảm (32 bit so với 128 bit tương ứng 160 bit). Nhưng nếu bạn chỉ muốn kiểm tra xem một chuỗi lưu trữ có bị hỏng hay không, bạn sẽ ổn với CRC32.


1
Ồ, chỉ có kiểu dữ liệu được yêu cầu là một số nguyên không dấu, điều này sẽ nhanh hơn so với các băm khác.
Giăng

2
@ John: hay không. CRC32 hóa ra chậm hơn MD4 và không nhanh hơn MD5 trên các bộ xử lý ARM. Ngoài ra, CRC32 sử dụng loại số nguyên 32 bit không dấu, chính xác là tất cả những gì MD5 cần ...
Thomas Pornin

3
nếu bạn có lợi ích / sự sang trọng của một cpu Intel mới hơn, có một lệnh lắp ráp crc32c ... có lẽ rất nhanh (mặc dù không phải là giá trị crc32 truyền thống). Xem thêm xxhash code.google.com/p/xxhash
rogerdpack

145
fcn     time  generated hash
crc32:  0.03163  798740135
md5:    0.0731   0dbab6d0c841278d33be207f14eeab8b
sha1:   0.07331  417a9e5c9ac7c52e32727cfd25da99eca9339a80
xor:    0.65218  119
xor2:   0.29301  134217728
add:    0.57841  1105

Và mã được sử dụng để tạo này là:

 $loops = 100000;
 $str = "ana are mere";

 echo "<pre>";

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $x = crc32($str);
 }
 $tse = microtime(true);
 echo "\ncrc32: \t" . round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $x = md5($str);
 }
 $tse = microtime(true);
 echo "\nmd5: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $x = sha1($str);
 }
 $tse = microtime(true);
 echo "\nsha1: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $l = strlen($str);
  $x = 0x77;
  for($j=0;$j<$l;$j++){
   $x = $x xor ord($str[$j]);
  }
 }
 $tse = microtime(true);
 echo "\nxor: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $l = strlen($str);
  $x = 0x08;
  for($j=0;$j<$l;$j++){
   $x = ($x<<2) xor $str[$j];
  }
 }
 $tse = microtime(true);
 echo "\nxor2: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $l = strlen($str);
  $x = 0;
  for($j=0;$j<$l;$j++){
   $x = $x + ord($str[$j]);
  }
 }
 $tse = microtime(true);
 echo "\nadd: \t".round($tse-$tss, 5) . " \t" . $x;

3
Ah, Cảm ơn bạn vì cái nhìn sâu sắc này thực sự, chỉ cần củng cố việc sử dụng CRC32 của tôi là nhanh nhất.
Giăng

@ John - Bạn có thể truy xuất các thuật toán băm bằng cách sử dụng : hash_algos(). Mã điểm chuẩn băm sau đây có trong các nhận xét PHP ==> codepad.viper-7.com/5Wdhw6
Peter Ajtai

Cảm ơn mã của bạn. Tôi đã cải thiện nó một chút. Tôi không nghĩ rằng chúng ta nên so sánh các hàm như md5 () xử lý toàn bộ chuỗi và các vòng lặp thực hiện từng byte như bạn đã thực hiện với xor. Trong PHP, các vòng lặp này rất chậm và thậm chí còn chậm hơn chính md5. Chúng ta nên so sánh một cái với một cái khác, tất cả được thực hiện như các chức năng.
Maxim Masiutin

1
Chỉ là một ghi chú nhanh - Tôi đã thử điều này với chuỗi dài hơn nhiều (~ 5000 ký tự) và CRC32 chậm hơn MD5 và SHA1 trên máy của tôi (i7-6650U, 16GB). CRC32 - 1.7s, MD5 - 1.4s, SHA1 - 1.5s. Luôn tự kiểm tra.
Sam Tolton

4
@Quamis bài kiểm tra rất hay nhưng có thể sai lệch - vì @samTolton lưu ý kết quả khác nhau và md5nhanh hơn. Một thử nghiệm tốt hơn sẽ là ngẫu nhiên nội dung chuỗi và độ dài quá. bằng cách này, chúng ta có được một ý tưởng tốt hơn về hiệu suất thực tế trong thế giới thực. Điều này cũng sẽ tránh bộ nhớ đệm. Hãy xem: hiệu suất kiểm tra băm php
Shlomi Hassid

43

Danh sách được xếp hạng trong đó mỗi vòng lặp chia sẻ cùng một thứ để mã hóa như tất cả các vòng lặp khác.

<?php

set_time_limit(720);

$begin = startTime();
$scores = array();


foreach(hash_algos() as $algo) {
    $scores[$algo] = 0;
}

for($i=0;$i<10000;$i++) {
    $number = rand()*100000000000000;
    $string = randomString(500);

    foreach(hash_algos() as $algo) {
        $start = startTime();

        hash($algo, $number); //Number
        hash($algo, $string); //String

        $end = endTime($start);

        $scores[$algo] += $end;
    }   
}


asort($scores);

$i=1;
foreach($scores as $alg => $time) {
    print $i.' - '.$alg.' '.$time.'<br />';
    $i++;
}

echo "Entire page took ".endTime($begin).' seconds<br />';

echo "<br /><br /><h2>Hashes Compared</h2>";

foreach($scores as $alg => $time) {
    print $i.' - '.$alg.' '.hash($alg,$string).'<br />';
    $i++;
}

function startTime() {
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   return $mtime;   
}

function endTime($starttime) {
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $endtime = $mtime; 
   return $totaltime = ($endtime - $starttime); 
}

function randomString($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $string = '';    
    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters) - 1)];
    }
    return $string;
}

?>

Và đầu ra

1 - crc32b 0.111036300659
2 - crc32 0.112048864365
3 - md4 0.120795726776
4 - md5 0.138875722885
5 - sha1 0.146368741989
6 - adler32 0.15501332283
7 - tiger192,3 0.177447080612
8 - tiger160,3 0.179498195648
9 - tiger128,3 0.184012889862
10 - ripemd128 0.184052705765
11 - ripemd256 0.185411214828
12 - salsa20 0.198500156403
13 - salsa10 0.204956293106
14 - haval160,3 0.206098556519
15 - haval256,3 0.206891775131
16 - haval224,3 0.206954240799
17 - ripemd160 0.207638263702
18 - tiger192,4 0.208125829697
19 - tiger160,4 0.208438634872
20 - tiger128,4 0.209359407425
21 - haval128,3 0.210256814957
22 - sha256 0.212738037109
23 - ripemd320 0.215386390686
24 - haval192,3 0.215610980988
25 - sha224 0.218329429626
26 - haval192,4 0.256464719772
27 - haval160,4 0.256565093994
28 - haval128,4 0.257113456726
29 - haval224,4 0.258928537369
30 - haval256,4 0.259262084961
31 - haval192,5 0.288433790207
32 - haval160,5 0.290239810944
33 - haval256,5 0.291721343994
34 - haval224,5 0.294484138489
35 - haval128,5 0.300224781036
36 - sha384 0.352449893951
37 - sha512 0.354603528976
38 - gost 0.392376661301
39 - whirlpool 0.629067659378
40 - snefru256 0.829529047012
41 - snefru 0.833986997604
42 - md2 1.80192279816
Entire page took 22.755341053 seconds


Hashes Compared

1 - crc32b 761331d7
2 - crc32 7e8c6d34
3 - md4 1bc8785de173e77ef28a24bd525beb68
4 - md5 9f9cfa3b5b339773b8d6dd77bbe931dd
5 - sha1 ca2bd798e47eab85655f0ce03fa46b2e6e20a31f
6 - adler32 f5f2aefc
7 - tiger192,3 d11b7615af06779259b29446948389c31d896dee25edfc50
8 - tiger160,3 d11b7615af06779259b29446948389c31d896dee
9 - tiger128,3 d11b7615af06779259b29446948389c3
10 - ripemd128 5f221a4574a072bc71518d150ae907c8
11 - ripemd256 bc89cd79f4e70b73fbb4faaf47a3caf263baa07e72dd435a0f62afe840f5c71c
12 - salsa20 91d9b963e172988a8fc2c5ff1a8d67073b2c5a09573cb03e901615dc1ea5162640f607e0d7134c981eedb761934cd8200fe90642a4608eacb82143e6e7b822c4
13 - salsa10 320b8cb8498d590ca2ec552008f1e55486116257a1e933d10d35c85a967f4a89c52158f755f775cd0b147ec64cde8934bae1e13bea81b8a4a55ac2c08efff4ce
14 - haval160,3 27ad6dd290161b883e614015b574b109233c7c0e
15 - haval256,3 03706dd2be7b1888bf9f3b151145b009859a720e3fe921a575e11be801c54c9a
16 - haval224,3 16706dd2c77b1888c29f3b151745b009879a720e4fe921a576e11be8
17 - ripemd160 f419c7c997a10aaf2d83a5fa03c58350d9f9d2e4
18 - tiger192,4 112f486d3a9000f822c050a204d284d52473f267b1247dbd
19 - tiger160,4 112f486d3a9000f822c050a204d284d52473f267
20 - tiger128,4 112f486d3a9000f822c050a204d284d5
21 - haval128,3 9d9155d430218e4dcdde1c62962ecca3
22 - sha256 6027f87b4dd4c732758aa52049257f9e9db7244f78c132d36d47f9033b5c3b09
23 - ripemd320 9ac00db553b51662826267daced37abfccca6433844f67d8f8cfd243cf78bbbf86839daf0961b61d
24 - haval192,3 7d706dd2d37c1888eaa53b154948b009e09c720effed21a5
25 - sha224 b6395266d8c7e40edde77969359e6a5d725f322e2ea4bd73d3d25768
26 - haval192,4 d87cd76e4c8006d401d7068dce5dec3d02dfa037d196ea14
27 - haval160,4 f2ddd76e156d0cd40eec0b8d09c8f23d0f47a437
28 - haval128,4 f066e6312b91e7ef69f26b2adbeba875
29 - haval224,4 1b7cd76ea97c06d439d6068d7d56ec3d73dba0373895ea14e465bc0e
30 - haval256,4 157cd76e8b7c06d432d6068d7556ec3d66dba0371c95ea14e165bc0ec31b9d37
31 - haval192,5 05f9ea219ae1b98ba33bac6b37ccfe2f248511046c80c2f0
32 - haval160,5 e054ec218637bc8b4bf1b26b2fb40230e0161904
33 - haval256,5 48f6ea210ee1b98be835ac6b7dc4fe2f39841104a37cc2f06ceb2bf58ab4fe78
34 - haval224,5 57f6ea2111e1b98bf735ac6b92c4fe2f43841104ab7cc2f076eb2bf5
35 - haval128,5 ccb8e0ac1fd12640ecd8976ab6402aa8
36 - sha384 bcf0eeaa1479bf6bef7ece0f5d7111c3aeee177aa7990926c633891464534cd8a6c69d905c36e882b3350ef40816ed02
37 - sha512 8def9a1e6e31423ef73c94251d7553f6fe3ed262c44e852bdb43e3e2a2b76254b4da5ef25aefb32aae260bb386cd133045adfa2024b067c2990b60d6f014e039
38 - gost ef6cb990b754b1d6a428f6bb5c113ee22cc9533558d203161441933d86e3b6f8
39 - whirlpool 54eb1d0667b6fdf97c01e005ac1febfacf8704da55c70f10f812b34cd9d45528b60d20f08765ced0ab3086d2bde312259aebf15d105318ae76995c4cf9a1e981
40 - snefru256 20849cbeda5ddec5043c09d36b2de4ba0ea9296b6c9efaa7c7257f30f351aea4
41 - snefru 20849cbeda5ddec5043c09d36b2de4ba0ea9296b6c9efaa7c7257f30f351aea4
42 - md2 d4864c8c95786480d1cf821f690753dc

4
Cuối cùng, có một lỗi nhỏ nhất. strlen($characters)nên strlen($characters) - 1:)
MM.

29

Có một so sánh tốc độ trên trang web xxhash. Sao chép dán nó ở đây:

 Name            Speed       Q.Score   Author
 xxHash          5.4 GB/s     10
 MumurHash 3a    2.7 GB/s     10       Austin Appleby
 SpookyHash      2.0 GB/s     10       Bob Jenkins
 SBox            1.4 GB/s      9       Bret Mulvey
 Lookup3         1.2 GB/s      9       Bob Jenkins
 CityHash64      1.05 GB/s    10       Pike & Alakuijala
 FNV             0.55 GB/s     5       Fowler, Noll, Vo
 CRC32           0.43 GB/s     9
 MD5-32          0.33 GB/s    10       Ronald L. Rivest
 SHA1-32         0.28 GB/s    10

Vì vậy, có vẻ như xxHash là công cụ nhanh nhất, trong khi nhiều người khác đánh bại các bản băm cũ hơn, như CRC32, MD5 và SHA.

https://code.google.com.vn/p/xxhash/

Lưu ý rằng đây là thứ tự trên trình biên dịch 32 bit. Trên trình biên dịch 64 bit, thứ tự hiệu năng có thể rất khác nhau. Một số giá trị băm dựa nhiều vào phép nhân và tìm nạp 64 bit.


17
+-------------------+---------+------+--------------+
|       NAME        |  LOOPS  | TIME |     OP/S     |
+-------------------+---------+------+--------------+
| sha1ShortString   | 1638400 | 2.85 | 574,877.19   |
| md5ShortString    | 2777680 | 4.11 | 675,834.55   |
| crc32ShortString  | 3847980 | 3.61 | 1,065,922.44 |
| sha1MediumString  | 602620  | 4.75 | 126,867.37   |
| md5MediumString   | 884860  | 4.69 | 188,669.51   |
| crc32MediumString | 819200  | 4.85 | 168,907.22   |
| sha1LongString    | 181800  | 4.95 | 36,727.27    |
| md5LongString     | 281680  | 4.93 | 57,135.90    |
| crc32LongString   | 226220  | 4.95 | 45,701.01    |
+-------------------+---------+------+--------------+

Có vẻ như crc32 nhanh hơn đối với các tin nhắn nhỏ (trong trường hợp này là 26 ký tự) trong khi md5 cho các tin nhắn dài hơn (trong trường hợp này> 852 ký tự).


17

Cập nhật 2019: Câu trả lời này là cập nhật nhất. Thư viện để hỗ trợ tiếng thì thầm phần lớn có sẵn cho tất cả các ngôn ngữ.

Các khuyến cáo hiện nay là sử dụng Hash Gia đình Murmur (xem cụ thể là murmur2 hoặc murmur3 biến thể).

Băm Murmur được thiết kế để băm nhanh với các va chạm tối thiểu (nhanh hơn nhiều so với CRC, MDx và SHAx). Thật hoàn hảo để tìm kiếm các bản sao và rất thích hợp cho các chỉ mục HashTable.

Trong thực tế, nó được sử dụng bởi nhiều cơ sở dữ liệu hiện đại (Redis, ElastisSearch, Cassandra) để tính toán tất cả các loại băm cho các mục đích khác nhau. Thuật toán cụ thể này là nguồn gốc của nhiều cải tiến hiệu suất trong thập kỷ hiện tại.

Nó cũng được sử dụng trong việc triển khai Bộ lọc Bloom . Bạn nên lưu ý rằng nếu bạn đang tìm kiếm "băm nhanh", có lẽ bạn đang phải đối mặt với một vấn đề điển hình được giải quyết bằng các bộ lọc Bloom. ;-)

Lưu ý : murmur là hàm băm có mục đích chung, có nghĩa là mật mã NON. Nó không ngăn cản việc tìm "văn bản" nguồn tạo ra một hàm băm. Nó không thích hợp để băm mật khẩu.

Một số chi tiết khác: MurmurHash - nó là gì?


2
Có một yêu cầu mở ở đây để thêm murmurhash vào php, mà bạn có thể bỏ phiếu.
keune

8

Thay vì cho rằng MD5 "khá chậm", hãy thử nó. Việc triển khai MD5 dựa trên C đơn giản trên PC đơn giản (của tôi, Core2 2,4 GHz, sử dụng lõi đơn) có thể băm 6 triệu tin nhắn nhỏ mỗi giây . Một thông điệp nhỏ ở đây là bất cứ thứ gì lên tới 55 byte. Đối với các tin nhắn dài hơn, tốc độ băm MD5 là tuyến tính với kích thước tin nhắn, tức là nó bẻ khóa dữ liệu với tốc độ khoảng 400 megabyte mỗi giây. Bạn có thể lưu ý rằng đây là bốn lần tốc độ tối đa của một ổ cứng tốt hoặc một card mạng ethernet gigabit.

Vì PC của tôi có bốn lõi, điều này có nghĩa là băm dữ liệu nhanh như ổ cứng của tôi có thể cung cấp hoặc nhận sử dụng tối đa 6% khả năng tính toán có sẵn. Phải mất một tình huống rất đặc biệt để tốc độ băm trở thành nút cổ chai hoặc thậm chí gây ra chi phí đáng chú ý trên PC.

Trên các kiến ​​trúc nhỏ hơn nhiều, nơi tốc độ băm có thể trở nên hơi liên quan, bạn có thể muốn sử dụng MD4. MD4 tốt cho các mục đích phi mật mã (và cho các mục đích mã hóa, dù sao bạn cũng không nên sử dụng MD5). Nó đã được báo cáo rằng MD4 thậm chí còn nhanh hơn CRC32 trên các nền tảng dựa trên ARM.


Có một điểm cần xem xét. MD5 mất 128 bit thay vì 32. Điều này có nghĩa là việc lưu trữ cơ sở dữ liệu chiếm không gian gấp 4 lần và do đó chậm hơn 4 lần để tìm kiếm so sánh băm (tôi nghĩ ). Điều tôi quan tâm (đối với việc sử dụng của tôi) là việc truy vấn cơ sở dữ liệu sau này sẽ nhanh đến mức nào khi nó đầy băm.
Camilo Martin

3
Nếu bạn không sử dụng một đầu ra đủ rộng thì bạn sẽ nhận được các xung đột ngẫu nhiên, điều này sẽ rất tệ vì mục tiêu là truy vấn cơ sở dữ liệu để biết liệu một "cụm từ" đã cho đã được biết chưa; va chạm ở đây biến thành dương tính giả. Với 32 bit, bạn sẽ bắt đầu thấy các xung đột ngay khi bạn có 60000 cụm từ. Điều này đúng với tất cả các hàm băm, mật mã hay không. Điều đó đang được nói, bạn luôn có thể lấy đầu ra của hàm băm và cắt nó theo bất kỳ độ dài nào bạn thấy phù hợp, trong các giới hạn được giải thích ở trên.
Thomas Pornin

@Thomasuckingin Nếu chúng ta đi theo cách cắt ngắn, nó sẽ không phải đối mặt với vấn đề va chạm nữa, ý tôi là lý do duy nhất md5 được cho là không va chạm dễ dàng là không có nhân vật nào có được khi so sánh với CRC32, phải không?
Mohd Abdul Mujib

4

Hãy cẩn thận

Câu trả lời dưới đây không trả lời câu hỏi như đã hỏi, vì nó không khuyến nghị các hàm băm. Hãy nhớ rằng, "Hàm băm là bất kỳ hàm nào có thể được sử dụng để ánh xạ dữ liệu có kích thước tùy ý thành các giá trị kích thước cố định." (Wikipedia) Câu trả lời dưới đây khuyến nghị các phép biến đổi không đảm bảo kết quả có kích thước cố định.

Nếu bạn sẵn sàng thư giãn yêu cầu sử dụng hàm băm , hãy đọc tiếp ...

Câu trả lời gốc

Tôi đề xuất urlencode () hoặc base64_encode () vì những lý do sau:

  • Bạn không cần mật mã
  • Bạn muốn tốc độ
  • Bạn muốn có một cách để xác định các chuỗi duy nhất trong khi dọn sạch các chuỗi 'không đúng định dạng'

Điều chỉnh mã điểm chuẩn ở những nơi khác trong các câu trả lời này, tôi đã chứng minh rằng một trong hai cách này nhanh hơn bất kỳ thuật toán băm nào. Tùy thuộc vào ứng dụng của bạn, bạn có thể sử dụng urlencode () hoặc base64_encode () để dọn sạch mọi chuỗi 'không đúng định dạng' mà bạn muốn lưu trữ.


Re: "Bạn muốn có một cách để xác định các chuỗi duy nhất trong khi dọn dẹp các chuỗi 'không đúng định dạng": bạn có thể giải thích rõ hơn không?
David J.

Thật khó để nhớ những gì tôi đã nghĩ hơn sáu năm trước ... Tôi có thể đã ám chỉ đến việc bạn không bị va chạm với urlencode hoặc base64_encode, vì vậy kết quả sẽ là duy nhất như các chuỗi ban đầu.
Anachronist

2

Bước một: Cài đặt libsodium (hoặc đảm bảo bạn đang sử dụng PHP 7.2+)

Bước hai: Sử dụng một trong các cách sau:

  1. sodium_crypto_generichash(), đó là BLAKE2b , một hàm băm an toàn hơn MD5 nhưng nhanh hơn SHA256. (Liên kết có điểm chuẩn, v.v.)
  2. sodium_crypto_shorthash(), đó là SipHash-2-4 , thích hợp cho các bảng băm nhưng không nên dựa vào khả năng chống va chạm.

_shorthashnhanh gấp khoảng 3 lần _generichash, nhưng bạn cần một chìa khóa và bạn có nguy cơ va chạm nhỏ nhưng thực tế. Với _generichash, có lẽ bạn không cần phải lo lắng về va chạm và không cần sử dụng khóa (nhưng dù sao cũng có thể muốn).


1
Câu hỏi là "cái này nhanh như thế nào"?
My1

1
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)- blake2b chắc chắn, nhưng việc thực hiện Userland PHP của blake2b sẽ có rất nhiều chậm hơn so với sha256 C-thực hiện cho PHP ... tôi muốn PHP có thể adobt blake2b trong hash_algos () bộ ..
hanshenrik

Việc triển khai PHP thuần túy không được đề xuất ở đây.
Scott Arciszewski

1

Nếu bạn đang tìm kiếm nhanh và độc đáo, tôi khuyên dùng xxHash hoặc thứ gì đó sử dụng lệnh tích hợp crc32c mới hơn của cpu, xem https://stackoverflow.com/a/11422479/32453 . Nó cũng liên kết ở đó để có thể băm thậm chí nhanh hơn nếu bạn không quan tâm đến khả năng va chạm nhiều.


1

Adler32 hoạt động tốt nhất trên máy của tôi. Và md5()hóa ra nhanh hơn crc32().


3
Nếu MD5 nhanh hơn hàm CRC32 chung thì có gì đó rất sai.
nxasdf 14/03/2015

0

Việc thực hiện cho md5 bên trong hàm băm nhanh hơn một chút so với md5 (). Vì vậy, đây có thể là một tùy chọn hoặc một số khác, vui lòng thử:

echo '<pre>';

$run = array();

function test($algo)
{
  #static $c = 0;
  #if($c>10) return;
  #$c++;

 $tss = microtime(true);
 for($i=0; $i<100000; $i++){
  $x = hash($algo, "ana are mere");
 }
 $tse = microtime(true);

 $GLOBALS['run'][(string)round($tse-$tss, 5)] = "\nhash({$algo}): \t".round($tse-$tss, 5) . " \t" . $x;
 #echo "\n$i nhash({$algo}): \t".round($tse-$tss, 5) . " \t" . $x;
}
array_map('test', hash_algos());
ksort($run);
print_r($run);
echo '</pre>';

Bạn có thể xem tại http://www.dozent.net/Tipps-Tricks/PHP/hash-performance


0

CRC32 nhanh hơn, nhưng kém an toàn hơn MD5 và SHA1. Không có nhiều sự khác biệt về tốc độ giữa MD5 và SHA1.


MD5 hiện được coi là không an toàn. Đó là cách không an toàn hơn SHA1. Đọc trang wiki MD5.
Ahmed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.