필자는 데이터베이스에 넣을 문구를 본질적으로 준비하고 있는데, 형식이 잘못되어 짧은 해시를 대신 저장하고 싶습니다 (단지 존재하는지 여부를 간단히 비교하므로 해시가 이상적입니다).
MD5가 100,000 + 요청에서 상당히 느리다고 가정하므로 문구를 해시하는 가장 좋은 방법이 무엇인지 알고 싶었습니다. 내 자신의 해시 함수를 롤아웃하거나 사용하는 hash('md4', '...'
것이 더 빠를 것입니까?
MySQL에는 MD5 ()가 있으므로 쿼리 끝에 약간의 속도를 보완하지만 MySQL에는 더 빠른 해싱 함수가 더있을 수 있습니다.
답변
CRC32는 매우 빠르며 이에 대한 기능이 있습니다 : http://www.php.net/manual/en/function.crc32.php
그러나 CRC32는 길이가 짧기 때문에 (128 비트와 각각 160 비트와 비교하여 32 비트) MD5 또는 SHA-1 해시보다 충돌이 더 크다는 점에 유의해야합니다. 그러나 저장된 문자열이 손상되었는지 확인하려면 CRC32를 사용하는 것이 좋습니다.
답변
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
그리고 이것을 생성하는 데 사용되는 코드는 다음과 같습니다.
$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;
답변
각 루프가 다른 모든 루프와 동일한 것을 공유하는 순위 목록.
<?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;
}
?>
그리고 출력
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
답변
xxhash 사이트에 속도 비교가 있습니다. 여기에 붙여 넣기 :
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
따라서 xxHash가 가장 빠른 것 같지만 다른 많은 사람들이 CRC32, MD5 및 SHA와 같은 오래된 해시를 이겼습니다.
https://code.google.com/p/xxhash/
이것은 32 비트 컴파일 순서입니다. 64 비트 컴파일에서 성능 순서는 매우 다를 수 있습니다. 해시 중 일부는 64 비트 곱셈 및 페치에 크게 의존합니다.
답변
+-------------------+---------+------+--------------+
| 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 |
+-------------------+---------+------+--------------+
작은 메시지 (이 경우 26 자)의 경우 crc32가 더 빠르고 긴 메시지 (이 경우> 852 자)의 경우 md5가 더 빠른 것 같습니다.
답변
2019 년 업데이트 :이 답변은 최신 정보입니다. 중얼 거림을 지원하는 라이브러리는 대부분의 언어로 제공됩니다.
현재 권장 사항은 Murmur Hash 제품군 을 사용하는 것입니다 (특히 murmur2 또는 murmur3 변형 참조).
Murmur 해시는 최소한의 충돌 (CRC, MDx 및 SHAx보다 훨씬 빠름)로 빠른 해싱을 위해 설계되었습니다. 중복을 찾고 HashTable 인덱스에 매우 적합합니다.
사실 그것은 현대의 많은 데이터베이스 (Redis, ElastisSearch, Cassandra)에서 다양한 목적으로 모든 종류의 해시를 계산하는 데 사용됩니다. 이 특정 알고리즘은 현재 10 년 동안 많은 성능 향상의 근본 원인이었습니다.
Bloom Filters 구현에도 사용됩니다 . “고속 해시”를 검색하는 경우 아마도 블룸 필터로 해결되는 일반적인 문제에 직면했을 수 있습니다. 😉
참고 : murmur는 NON 암호화를 의미하는 범용 해시입니다. 해시를 생성 한 소스 “텍스트”를 찾는 것을 막을 수는 없습니다. 비밀번호를 해시하는 것은 적합하지 않습니다.
자세한 내용 은 MurmurHash-무엇입니까?
답변
MD5가 “정말 느리다”고 가정하지 말고 시도하십시오. 간단한 PC (단일 코어를 사용하는 2.4GHz Core2)에서 간단한 C5 기반 MD5 구현은 초당 6 백만 개의 작은 메시지를 해시 할 수 있습니다 . 작은 메시지는 여기에서 최대 55 바이트입니다. 더 긴 메시지의 경우 MD5 해싱 속도는 메시지 크기와 선형입니다. 즉, 초당 약 400MB의 데이터를 크런치합니다. 이것은 좋은 하드 디스크 나 기가비트 이더넷 네트워크 카드의 최대 속도의 4 배입니다.
내 PC에는 4 개의 코어가 있기 때문에 내 하드 디스크가 최대 6 %의 가용 컴퓨팅 성능을 제공하거나 수신 할 수있는 한 빠른 해싱 데이터를 의미합니다. 해싱 속도가 병목 현상이되거나 심지어 PC에서 눈에 띄는 비용을 유발하기 위해서는 매우 특별한 상황이 필요합니다.
해싱 속도가 훨씬 작은 구조에 있습니다 어느 정도 관련이 될, 당신은 MD4를 사용할 수 있습니다. MD4는 비 암호화 목적에 적합합니다 (암호화 목적에는 MD5를 사용해서는 안됩니다). ARM 기반 플랫폼에서 MD4가 CRC32보다 훨씬 빠르다고보고되었습니다.