Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

URL ΠΈ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ — API. Yandex Safe Browsing

Бписки Safe Browsing состоят ΠΈΠ· прСфиксов Ρ…ΡΡˆΠ΅ΠΉ SHA-256 ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ (ΠΎΡ‚ 4 Π΄ΠΎ 32 Π±Π°ΠΉΡ‚), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ URL ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-рСсурсов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΡƒΠ³Ρ€ΠΎΠ·Ρƒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ URL Π² спискС (Π² локальной Π±Π°Π·Π΅ ΠΈΠ»ΠΈ Π½Π° сСрвСрС), вычислитС прСфикс Ρ…ΡΡˆΠ°. Для этого:

  1. ΠŸΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ URL ΠΊ каноничСскому Π²ΠΈΠ΄Ρƒ.

  2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ выраТСния для хоста ΠΈ ΠΏΡƒΡ‚ΠΈ.

  3. ВычислитС Ρ…ΡΡˆ ΠΏΠΎΠ»Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ ΠΈ прСфикс Ρ…ΡΡˆΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° языкС Golang.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поиск ΠΏΠΎ локальной Π±Π°Π·Π΅ списков Safe Browsing. Если прСфикс Ρ…ΡΡˆΠ° Π½Π°ΠΉΠ΄Π΅Π½, ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² запросС.

URL Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ стандарту RFC 2396. URL Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½Π°Ρ… (IDN), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ .Ρ€Ρ„, Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ASCII ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Punycode. URL Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡƒΡ‚ΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ слСшСм: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, https://yandex.

ru/.

Π§Ρ‚ΠΎΠ±Ρ‹ привСсти URL ΠΊ каноничСскому Π²ΠΈΠ΄Ρƒ:

  1. Π£Π΄Π°Π»ΠΈΡ‚Π΅ Π·Π½Π°ΠΊΠΈ табуляции 0x09 ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки 0x0d ΠΈ 0x0a.

  2. Π£Π΄Π°Π»ΠΈΡ‚Π΅ ΡΠΊΠΎΡ€ΡŒ. НапримСр, https://yandex.ru/#anchor сократитС Π΄ΠΎ https://yandex.ru/.

  3. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅:

    Π₯ост
    • Π£Π΄Π°Π»ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅.

    • Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° ΠΎΠ΄Π½Ρƒ.

    • Если имя хоста β€” IP-адрСс, ΠΏΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… дСсятичных чисСл, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

    • ΠŸΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ ΠΊ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ рСгистру.

    ΠŸΡƒΡ‚ΡŒ

    ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. НС примСняйтС эти дСйствия ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ запроса.

    • Π£Π΄Π°Π»ΠΈΡ‚Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов /. ./ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ /./ Π½Π° /.

    • Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… слСшСй Π½Π° ΠΎΠ΄ΠΈΠ½.

  4. Π­ΠΊΡ€Π°Π½ΠΈΡ€ΡƒΠΉΡ‚Π΅ всС ASCII-символы младшС 32 ΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅ 127, Π° Ρ‚Π°ΠΊΠΆΠ΅ # ΠΈ %. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΡƒΡŽ запись Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ URLΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π²ΠΈΠ΄
http://host/%25%32%35
http://host/%25
http://host/%25%32%35%25%32%35
http://host/%25%25
http://host/%2525252525252525
http://host/%25
http://host/asdf%25%32%35asd
http://host/asdf%25asd
http://host/%%%25%32%35asd%%
http://host/%25%25%25asd%25%25
http://%32%31%33%2e%31%38%30%2e%32%31%30%2e5/%2e%73%65%63%75%72%65%2f%77%77%77%2e%6d%6f%69%6b%72%75%67%2e%72%75/
http://213. 00&11*22(33)44_55+
http://3279880203/smth
http://195.127.0.11/smth
http://www.yandex.ru/smth/..
http://www.yandex.ru/
www.yandex.ru
http://www.yandex.ru/
http://www.zlo.com/smth#ancor
http://www.zlo.com/smth
http://www.YANdex.ru/
http://www.yandex.ru/
http://www.yandex.ru.../
http://www.
yandex.ru/
http://www.yandex.ru/m\ta\rp\ns
http://www.yandex.ru/maps
http://zlo.com/smth#more#again
http://zlo.com/smth
http://\x01\x80.com/
http://%01%80.com/
http://www.hostport.com:1234/
http://www.hostport.com/
  http://www.yandex.ru/  
http://www.yandex.ru/
http:// probel.ru/
http://%20probel. ru/
http://host.com//dvaslesha?more//slashes
http://host.com/dvaslesha?more//slashes

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ URL ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊ каноничСской Ρ„ΠΎΡ€ΠΌΠ΅, создайтС:

  1. ВыраТСния для хоста ΠΈ ΠΏΡƒΡ‚ΠΈ.

  2. ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ этих Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ВыраТСния для хоста

Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 5 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… строк:

  • ПолноС имя хоста.

  • Π”ΠΎ 4 ΠΈΠΌΠ΅Π½ хоста, начиная с послСдних пяти ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ удаляя ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ. Π”ΠΎΠΌΠ΅Π½ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΈ строки Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, Ссли имя хоста β€” IP-адрСс.

ВыраТСния для ΠΏΡƒΡ‚ΠΈ

Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 6 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… строк:

  • ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ запроса.

  • ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² запроса.

  • 4 ΠΏΡƒΡ‚ΠΈ, начиная с корня ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ добавляя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡƒΡ‚ΠΈ с Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ слСшСм.

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ

Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄ΠΎ 30 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для хоста ΠΈ ΠΏΡƒΡ‚ΠΈ. Π­Ρ‚ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя хоста ΠΈ ΠΏΡƒΡ‚ΡŒ; схСма (ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»), имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ ΠΏΠΎΡ€Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ. Если Π² URL Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½Π° комбинация Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Для URL http://a.b.c/1/2.html?param=1 Π½ΡƒΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки:

a.b.c/1/2.html?param=1
a.b.c/1/2.html
a.b.c/
a.b.c/1/
b.c/1/2.html?param=1
b.c/1/2.html
b.c/
b.c/1/ 

Для URL http://a.b.c.d.e.f.g/1.html Π½ΡƒΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки:

a.b.c.d.e.f.g/1.html
a.b.c.d.e.f.g/
(Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ b.c.d.e.f.g Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдниС ΠΏΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠΌΠ΅Π½ΠΈ хоста ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя хоста)
c. d.e.f.g/1.html
c.d.e.f.g/
d.e.f.g/1.html
d.e.f.g/
e.f.g/1.html
e.f.g/
f.g/1.html
f.g/

Для URL http://1.2.3.4/1/ Π½ΡƒΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки:

1.2.3.4/1/
1.2.3.4/

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для хоста ΠΈ ΠΏΡƒΡ‚ΠΈ сформированы, вычислитС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… Ρ…ΡΡˆ SHA256 ΠΏΠΎΠ»Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

Π—Π°Ρ‚Π΅ΠΌ вычислитС прСфикс для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ…ΡΡˆΠ° ΠΏΠΎΠ»Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ Ρ…ΡΡˆΠ° состоит ΠΈΠ· 4–32 Π±Π°ΠΉΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· стандарта FIPS-180-4:

Π₯эш для строки abc
Π₯эш для строки abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq

Π‘Ρ‹Π»Π° Π»ΠΈ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ»Π΅Π·Π½Π°?

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΡΡˆ-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ SHA-2 (SHA 256)? Π Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅

Автор ΠœΠ°Ρ€ΠΈΡ Π‘Π°Π³ΡƒΠ»ΠΈΠ½Π°

SHA-2 (Secure Hash Algorithm 2) β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· самых популярных сСмСйств Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° SHA-256, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΠΊ SHA-2, ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ…Π΅Ρˆ-функция?

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ…Π΅Ρˆ-функциях, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡŽ. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΎ Ρ‡Ρ‘ΠΌ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ€Π΅Ρ‡ΡŒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ вспомним Ρ‚Ρ€ΠΈ основныС Ρ†Π΅Π»ΠΈ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ цСлостности (нСизмСнности) Π΄Π°Π½Π½Ρ‹Ρ…;
  • ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ любой Π΄Π»ΠΈΠ½Ρ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ фиксированной Π΄Π»ΠΈΠ½Ρ‹;
  • Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ (Π²Π²ΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΈΠ· Π²Ρ‹Π²ΠΎΠ΄Π°).

SHA-2 ΠΈ SHA-256

SHA-2 β€” это сСмСйство Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈΠ΄Π΅Π΅ΠΉ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ…. SHA-256 устанавливаСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ константы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° SHA-2. Одной ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… констант являСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°. Β«256Β» ΠΈ Β«512Β» относятся ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΠΈΡ‚Π°Ρ….

ΠœΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ SHA-256.

SHA-256 Β«hello worldΒ». Π¨Π°Π³ 1. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

1. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Β«hello worldΒ» Π² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄:

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100

2. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ:

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100 1

3. ЗаполняСм нулями Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ станут ΠΊΡ€Π°Ρ‚Π½Ρ‹ 512 Π±Π΅Π· послСдних 64 Π±ΠΈΡ‚ (Π² нашСм случаС 448 Π±ΠΈΡ‚):

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100 10000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

4. Π”ΠΎΠ±Π°Π²ΠΈΠΌ 64 Π±ΠΈΡ‚Π° Π² ΠΊΠΎΠ½Π΅Ρ†, Π³Π΄Π΅ 64 Π±ΠΈΡ‚Π° β€” Ρ†Π΅Π»ΠΎΠ΅ число с порядком Π±Π°ΠΉΡ‚ΠΎΠ² big-endian, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π΄Π»ΠΈΠ½Ρƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π’ нашСм случаС 88, Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ β€” Β«1011000Β».

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100 10000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01011000

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π²Π²ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π±Π΅Π· остатка Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½Π° 512.

Π¨Π°Π³ 2. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ…Π΅ΡˆΠ° (h)

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ 8 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ…Π΅ΡˆΠ°. Π­Ρ‚ΠΎ константы, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 32 Π±ΠΈΡ‚Π° Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… частСй ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΊΠΎΡ€Π½Π΅ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 8 простых чисСл: 2, 3, 5, 7, 11, 13, 17, 19.

h0 := 0x6a09e667
h2 := 0xbb67ae85
h3 := 0x3c6ef372
h4 := 0xa54ff53a
h5 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

Π¨Π°Π³ 3. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠΊΡ€ΡƒΠ³Π»Ρ‘Π½Π½Ρ‹Ρ… констант (k)

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅Ρ‰Ρ‘ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ констант, Π½Π° этот Ρ€Π°Π· ΠΈΡ… 64. КаТдоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” это ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 32 Π±ΠΈΡ‚Π° Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… частСй кубичСских ΠΊΠΎΡ€Π½Π΅ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 64 простых чисСл (2–311).

0x428a2f98 0x71374491 0xb5c0fbcf 0xe9b5dba5 0x3956c25b 0x59f111f1 0x923f82a4 0xab1c5ed5
0xd807aa98 0x12835b01 0x243185be 0x550c7dc3 0x72be5d74 0x80deb1fe 0x9bdc06a7 0xc19bf174
0xe49b69c1 0xefbe4786 0x0fc19dc6 0x240ca1cc 0x2de92c6f 0x4a7484aa 0x5cb0a9dc 0x76f988da
0x983e5152 0xa831c66d 0xb00327c8 0xbf597fc7 0xc6e00bf3 0xd5a79147 0x06ca6351 0x14292967
0x27b70a85 0x2e1b2138 0x4d2c6dfc 0x53380d13 0x650a7354 0x766a0abb 0x81c2c92e 0x92722c85
0xa2bfe8a1 0xa81a664b 0xc24b8b70 0xc76c51a3 0xd192e819 0xd6990624 0xf40e3585 0x106aa070
0x19a4c116 0x1e376c08 0x2748774c 0x34b0bcb5 0x391c0cb3 0x4ed8aa4a 0x5b9cca4f 0x682e6ff3
0x748f82ee 0x78a5636f 0x84c87814 0x8cc70208 0x90befffa 0xa4506ceb 0xbef9a3f7 0xc67178f2

Π¨Π°Π³ 4.

Основной Ρ†ΠΈΠΊΠ»

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ 512-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ «куска» Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Наша тСстовая Ρ„Ρ€Π°Π·Π° Β«hello worldΒ» довольно короткая, поэтому «кусок» всСго ΠΎΠ΄ΠΈΠ½. На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ h0–h7, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π¨Π°Π³ 5. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний (w)

1. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· шага 1 Π² Π½ΠΎΠ²Ρ‹ΠΉ массив, Π³Π΄Π΅ каТдая запись являСтся 32-Π±ΠΈΡ‚Π½Ρ‹ΠΌ словом:

01101000011001010110110001101100 01101111001000000111011101101111
01110010011011000110010010000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000001011000

2. ДобавляСм Π΅Ρ‰Ρ‘ 48 слов, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… нулями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массив w[0…63]:

01101000011001010110110001101100 01101111001000000111011101101111
01110010011011000110010010000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000001011000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
...
...
00000000000000000000000000000000 00000000000000000000000000000000

3. ИзмСняСм Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ индСксы Π² ΠΊΠΎΠ½Ρ†Π΅ массива, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ:

  • For i from w[16…63]:
    • s0 = (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] righthift 3)
    • s1 = (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] righthift 10)
    • w [i] = w[i-16] + s0 + w[i-7] + s1

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для w[16]:

w[1] rightrotate 7:
  01101111001000000111011101101111 -> 11011110110111100100000011101110
w[1] rightrotate 18:
  01101111001000000111011101101111 -> 00011101110110111101101111001000
w[1] rightshift 3:
  01101111001000000111011101101111 -> 00001101111001000000111011101101

s0 = 11011110110111100100000011101110 XOR 00011101110110111101101111001000 XOR 00001101111001000000111011101101

s0 = 11001110111000011001010111001011

w[14] rightrotate 17:
  00000000000000000000000000000000 -> 00000000000000000000000000000000
w[14] rightrotate19:
  00000000000000000000000000000000 -> 00000000000000000000000000000000
w[14] rightshift 10:
  00000000000000000000000000000000 -> 00000000000000000000000000000000

s1 = 00000000000000000000000000000000 XOR 00000000000000000000000000000000 XOR 00000000000000000000000000000000

s1 = 00000000000000000000000000000000

w[16] = w[0] + s0 + w[9] + s1

w[16] = 01101000011001010110110001101100 + 11001110111000011001010111001011 + 00000000000000000000000000000000 + 00000000000000000000000000000000

// слоТСниС рассчитываСтся ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 2^32

w[16] = 00110111010001110000001000110111

Π­Ρ‚ΠΎ оставляСт Π½Π°ΠΌ 64 слова Π² нашСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний (w):

01101000011001010110110001101100 01101111001000000111011101101111
01110010011011000110010010000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000001011000
00110111010001110000001000110111 10000110110100001100000000110001
11010011101111010001000100001011 01111000001111110100011110000010
00101010100100000111110011101101 01001011001011110111110011001001
00110001111000011001010001011101 10001001001101100100100101100100
01111111011110100000011011011010 11000001011110011010100100111010
10111011111010001111011001010101 00001100000110101110001111100110
10110000111111100000110101111101 01011111011011100101010110010011
00000000100010011001101101010010 00000111111100011100101010010100
00111011010111111110010111010110 01101000011001010110001011100110
11001000010011100000101010011110 00000110101011111001101100100101
10010010111011110110010011010111 01100011111110010101111001011010
11100011000101100110011111010111 10000100001110111101111000010110
11101110111011001010100001011011 10100000010011111111001000100001
11111001000110001010110110111000 00010100101010001001001000011001
00010000100001000101001100011101 01100000100100111110000011001101
10000011000000110101111111101001 11010101101011100111100100111000
00111001001111110000010110101101 11111011010010110001101111101111
11101011011101011111111100101001 01101010001101101001010100110100
00100010111111001001110011011000 10101001011101000000110100101011
01100000110011110011100010000101 11000100101011001001100000111010
00010001010000101111110110101101 10110000101100000001110111011001
10011000111100001100001101101111 01110010000101111011100000011110 
10100010110101000110011110011010 00000001000011111001100101111011
11111100000101110100111100001010 11000010110000101110101100010110

Π¨Π°Π³ 6.

Π¦ΠΈΠΊΠ» сТатия
  1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ a, b, c, d, e, f, g, h ΠΈ установим ΠΈΡ… Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ значСниям Ρ…Π΅ΡˆΠ° соотвСтствСнно. h0, h2, h3, h4, h5, h5, h6, h7.
  2. Запустим Ρ†ΠΈΠΊΠ» сТатия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния a…h . Π¦ΠΈΠΊΠ» выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
  • for i from 0 to 63
    • S1 = (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
    • ch = (e and f) xor ((not e) and g)
    • temp1 = h + S1 + ch + k[i] + w[i]
    • S0 = (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
    • maj = (a and b) xor (a and c) xor (b and c)
    • temp2 := S0 + maj
    • h = g
    • g = f
    • f = e
    • e = d + temp1
    • d = c
    • c = b
    • b = a
    • a = temp1 + temp2

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ. 32:

a = 0x6a09e667 = 01101010000010011110011001100111
b = 0xbb67ae85 = 10111011011001111010111010000101
c = 0x3c6ef372 = 00111100011011101111001101110010
d = 0xa54ff53a = 10100101010011111111010100111010
e = 0x510e527f = 01010001000011100101001001111111
f = 0x9b05688c = 10011011000001010110100010001100
g = 0x1f83d9ab = 00011111100000111101100110101011
h = 0x5be0cd19 = 01011011111000001100110100011001

e rightrotate 6:
  01010001000011100101001001111111 -> 11111101010001000011100101001001
e rightrotate 11:
  01010001000011100101001001111111 -> 01001111111010100010000111001010
e rightrotate 25:
  01010001000011100101001001111111 -> 10000111001010010011111110101000
S1 = 11111101010001000011100101001001 XOR 01001111111010100010000111001010 XOR 10000111001010010011111110101000
S1 = 00110101100001110010011100101011

e and f:
    01010001000011100101001001111111
  & 10011011000001010110100010001100 =
    00010001000001000100000000001100
not e:
  01010001000011100101001001111111 -> 10101110111100011010110110000000
(not e) and g:
    10101110111100011010110110000000
  & 00011111100000111101100110101011 =
    00001110100000011000100110000000
ch = (e and f) xor ((not e) and g)
   = 00010001000001000100000000001100 xor 00001110100000011000100110000000
   = 00011111100001011100100110001100

// k[i] is the round constant
// w[i] is the batch
temp1 = h + S1 + ch + k[i] + w[i]
temp1 = 01011011111000001100110100011001 + 00110101100001110010011100101011 + 00011111100001011100100110001100 + 1000010100010100010111110011000 + 01101000011001010110110001101100
temp1 = 01011011110111010101100111010100

a rightrotate 2:
  01101010000010011110011001100111 -> 11011010100000100111100110011001
a rightrotate 13:
  01101010000010011110011001100111 -> 00110011001110110101000001001111
a rightrotate 22:
  01101010000010011110011001100111 -> 00100111100110011001110110101000
S0 = 11011010100000100111100110011001 XOR 00110011001110110101000001001111 XOR 00100111100110011001110110101000
S0 = 11001110001000001011010001111110

a and b:
    01101010000010011110011001100111
  & 10111011011001111010111010000101 =
    00101010000000011010011000000101
a and c:
    01101010000010011110011001100111
  & 00111100011011101111001101110010 =
    00101000000010001110001001100010
b and c:
    10111011011001111010111010000101
  & 00111100011011101111001101110010 =
    00111000011001101010001000000000
maj = (a and b) xor (a and c) xor (b and c)
    = 00101010000000011010011000000101 xor 00101000000010001110001001100010 xor 00111000011001101010001000000000 
    = 00111010011011111110011001100111

temp2 = S0 + maj
      = 11001110001000001011010001111110 + 00111010011011111110011001100111
      = 00001000100100001001101011100101

h = 00011111100000111101100110101011
g = 10011011000001010110100010001100
f = 01010001000011100101001001111111
e = 10100101010011111111010100111010 + 01011011110111010101100111010100
  = 00000001001011010100111100001110
d = 00111100011011101111001101110010
c = 10111011011001111010111010000101
b = 01101010000010011110011001100111
a = 01011011110111010101100111010100 + 00001000100100001001101011100101
  = 01100100011011011111010010111001

ВсС расчёты Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΅Ρ‰Ρ‘ 63 Ρ€Π°Π·Π°, измСняя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ а…h. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

h0 = 6A09E667 = 01101010000010011110011001100111
h2 = BB67AE85 = 10111011011001111010111010000101
h3 = 3C6EF372 = 00111100011011101111001101110010
h4 = A54FF53A = 10100101010011111111010100111010
h5 = 510E527F = 01010001000011100101001001111111
h5 = 9B05688C = 10011011000001010110100010001100
h6 = 1F83D9AB = 00011111100000111101100110101011
h7 = 5BE0CD19 = 01011011111000001100110100011001

a = 4F434152 = 001001111010000110100000101010010
b = D7E58F83 = 011010111111001011000111110000011
c = 68BF5F65 = 001101000101111110101111101100101
d = 352DB6C0 = 000110101001011011011011011000000
e = 73769D64 = 001110011011101101001110101100100
f = DF4E1862 = 011011111010011100001100001100010
g = 71051E01 = 001110001000001010001111000000001
h = 870F00D0 = 010000111000011110000000011010000

Π¨Π°Π³ 7. ИзмСняСм ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния

ПослС Ρ†ΠΈΠΊΠ»Π° сТатия, Π½ΠΎ Π΅Ρ‰Ρ‘ Π²Π½ΡƒΡ‚Ρ€ΠΈ основного Ρ†ΠΈΠΊΠ»Π°, ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ значСния Ρ…Π΅ΡˆΠ°, добавляя ΠΊ Π½ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ a…h. 32.

h0 = h0 + a = 10111001010011010010011110111001
h2 = h2 + b = 10010011010011010011111000001000
h3 = h3 + c = 10100101001011100101001011010111
h4 = h4 + d = 11011010011111011010101111111010
h5 = h5 + e = 11000100100001001110111111100011
h5 = h5 + f = 01111010010100111000000011101110
h6 = h6 + g = 10010000100010001111011110101100
h7 = h7 + h = 11100010111011111100110111101001

Π¨Π°Π³ 8. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π΅Ρˆ

И послСдний Π²Π°ΠΆΠ½Ρ‹ΠΉ шаг β€” собираСм всё вмСстС.

digest = h0 append h2 append h3 append h4 append h5 append h5 append h6 append h7
       = B94D27B9934D3E08A52E52D7DA7DABFAC484EFE37A5380EE9088F7ACE2EFCDE9

Π“ΠΎΡ‚ΠΎΠ²ΠΎ! ΠœΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг SHA-2 (SHA-256) (Π±Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ).

Алгоритм SHA-2 Π² Π²ΠΈΠ΄Π΅ псСвдокода

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° всС шаги, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ сдСлали, Π² Π²ΠΈΠ΄Π΅ псСвдокода, Ρ‚ΠΎ Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ПояснСния:
 ВсС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅, ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ 32 Π±ΠΈΡ‚Π° ΠΈ ΠΏΡ€ΠΈ вычислСниях ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 232
 message β€” исходноС Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ сообщСниС
 m β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сообщСниС

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
 (ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 32 Π±ΠΈΡ‚Π° Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… частСй ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΊΠΎΡ€Π½Π΅ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… восьми простых чисСл [ΠΎΡ‚ 2 Π΄ΠΎ 19]):
h0 := 0x6a09e667
h2 := 0xbb67ae85
h3 := 0x3c6ef372
h4 := 0xa54ff53a
h5 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

Π’Π°Π±Π»ΠΈΡ†Π° констант
(ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 32 Π±ΠΈΡ‚Π° Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… частСй кубичСских ΠΊΠΎΡ€Π½Π΅ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 64 простых чисСл [ΠΎΡ‚ 2 Π΄ΠΎ 311]):
k[ 0. .63 ] :=
   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°:
m := message ǁ [Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΠΈΡ‚]
m := m ǁ [k Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… Π±ΠΈΡ‚], Π³Π΄Π΅ k β€” наимСньшСС Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, Ρ‚Π°ΠΊΠΎΠ΅ Ρ‡Ρ‚ΠΎ 
                 (L + 1 + K) mod 512 = 448, Π³Π΄Π΅ L β€” число Π±ΠΈΡ‚ Π² сообщСнии (сравнима ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 512 c 448)
m := m ǁ Π”Π»ΠΈΠ½Π°(message) β€” Π΄Π»ΠΈΠ½Π° исходного сообщСния Π² Π±ΠΈΡ‚Π°Ρ… Π² Π²ΠΈΠ΄Π΅ 64-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ числа
            с порядком Π±Π°ΠΉΡ‚ΠΎΠ² ΠΎΡ‚ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ ΠΊ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ

Π”Π°Π»Π΅Π΅ сообщСниС обрабатываСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ порциями ΠΏΠΎ 512 Π±ΠΈΡ‚:
Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ сообщСниС Π½Π° куски ΠΏΠΎ 512 Π±ΠΈΡ‚
для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ куска
    Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ кусок Π½Π° 16 слов Π΄Π»ΠΈΠ½ΠΎΠΉ 32 Π±ΠΈΡ‚Π° (с порядком Π±Π°ΠΉΡ‚ΠΎΠ² ΠΎΡ‚ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ ΠΊ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ слова): w[ 0. .15 ]


    Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ 48 слов:
    для i ΠΎΡ‚ 16 Π΄ΠΎ 63
        s0 := (w[i-15] rightrotate  7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift  3)
        s1 := (w[i- 2] rightrotate 17) xor (w[i- 2] rightrotate 19) xor (w[i- 2] rightshift 10)
        w[i] := w[i-16] + s0 + w[i-7] + s1

    Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:
    a := h0
    b := h2
    c := h3
    d := h4
    e := h5
    f := h5
    g := h6
    h := h7

    Основной Ρ†ΠΈΠΊΠ»:
    для i ΠΎΡ‚ 0 Π΄ΠΎ 63
        S1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
        ch := (e and f) xor ((not e) and g)
        temp1 := h + S1 + ch + k[i] + w[i]
        S0 := (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
        maj := (a and b) xor (a and c) xor (b and c)
        temp2 := S0 + maj
 
        h := g
        g := f
        f := e
        e := d + temp1
        d := c
        c := b
        b := a
        a := temp1 + temp2

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния ΠΊ Ρ€Π°Π½Π΅Π΅ вычислСнному Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ:
    h0 := h0 + a
    h2 := h2 + b
    h3 := h3 + c
    h4 := h4 + d
    h5 := h5 + e
    h5 := h5 + f
    h6 := h6 + g
    h7 := h7 + h

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅ΡˆΠ° SHA-2:
digest := hash := h0 append h2 append h3 append h4 append h5 append h5 append h6 append h7

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«How SHA-2 Works Step-By-Step (SHA-256)Β»

PHP: Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ — Manual

Change language: EnglishBrazilian PortugueseChinese (Simplified)FrenchGermanJapaneseRussianSpanishTurkishOther

Submit a Pull Request Report a Bug

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π°Π·ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, стоящиС Π·Π° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² цСлях бСзопасности, Π° Ρ‚Π°ΠΊΠΆΠ΅ эффСктивныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

  1. ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ?
  2. ΠŸΠΎΡ‡Π΅ΠΌΡƒ популярныС Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ md5 ΠΈ sha1 Π½Π΅ подходят для ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ?
  3. Если популярныС Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ подходят, ΠΊΠ°ΠΊ ΠΆΠ΅ я Ρ‚ΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΠ°Ρ€ΠΎΠ»ΠΈ?
  4. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ соль?
  5. Как я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свою соль?
ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ?

Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых основных сообраТСний бСзопасности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π‘Π΅Π· Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠ°Ρ€ΠΎΠ»ΠΈ, хранящиСся Π² Π±Π°Π·Π΅ вашСго прилоТСния, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΡ€Π°Π΄Π΅Π½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли ваша Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ‹Π»Π° скомпромСтирована, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ для ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π°Ρ†ΠΈΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вашСго прилоТСния, Π½ΠΎ ΠΈ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… сСрвисах, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ паролям ΠΏΠ΅Ρ€Π΅Π΄ сохранСниСм ΠΈΡ… Π² своСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ€Π°Π·Π³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ пароля для Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Π°ΡˆΡƒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя сохраняя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сравнСния ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ…Π΅ΡˆΠ° с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ.

Π’Π°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ компромСтирования Π² вашСм Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° врСдоносного ΠΊΠΎΠ΄Π° Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ популярныС Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ md5() ΠΈ sha1() Π½Π΅ подходят для ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ?

Π’Π°ΠΊΠΈΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΊΠ°ΠΊ MD5, SHA1 ΠΈ SHA256 Π±Ρ‹Π»ΠΈ спроСктированы ΠΎΡ‡Π΅Π½ΡŒ быстрыми ΠΈ эффСктивными. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ соврСмСнных Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ оборудования, стало довольно просто Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ «Π³Ρ€ΡƒΠ±ΠΎΠΉ силы» для опрСдСлСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Из-Π·Π° Ρ‚ΠΎΠΉ скорости, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ соврСмСнныС ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ «ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ» эти Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ профСссионалы ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ бСзопасности строго Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

Если популярныС Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ подходят, ΠΊΠ°ΠΊ ΠΆΠ΅ я Ρ‚ΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΠ°Ρ€ΠΎΠ»ΠΈ?

ΠŸΡ€ΠΈ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ сущСствуСт Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… сообраТСния: это ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ вычислСния ΠΈ соль. Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ вычислСния Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ трСбуСтся для Π²Π·Π»ΠΎΠΌΠ° Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ «Π³Ρ€ΡƒΠ±ΠΎΠΉ силы».

PHP прСдоставляСт встроСнноС API Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ бСзопасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ с Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ являСтся функция crypt(), которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. ΠŸΡ€ΠΈ использовании этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ доступСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ PHP содСрТит ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Π΄Π°ΠΆΠ΅ Π² случаС, Ссли ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ вашСй систСмой.

ΠŸΡ€ΠΈ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ рСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Blowfish, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² API Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большСй Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ слоТности, Ρ‡Π΅ΠΌ MD5 ΠΈΠ»ΠΈ SHA1, ΠΏΡ€ΠΈ этом ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π³ΠΈΠ±ΠΎΠΊ.

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ crypt() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пароля, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅Ρ‡ΡŒ сСбя ΠΎΡ‚ Π°Ρ‚Π°ΠΊ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, примСняя сравнСниС строк, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ постоянноС врСмя. Ни ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ PHP == ΠΈ ===, Π½ΠΈ функция strcmp() Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ. Ѐункция ΠΆΠ΅ password_verify() ΠΊΠ°ΠΊ Ρ€Π°Π· Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ. ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнноС API Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Ссли Π΅ΡΡ‚ΡŒ такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ соль?

ΠšΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΠ°Ρ соль прСдставляСт собой Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² процСссС Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ для прСдотвращСния возмоТности Ρ€Π°Π·Π³Π°Π΄Π°Ρ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поиска Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² спискС Π·Π°Ρ€Π°Π½Π΅Π΅ вычислСнных ΠΏΠ°Ρ€ Π²Π²ΠΎΠ΄-Ρ…Π΅Ρˆ, извСстном Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ «Ρ€Π°Π΄ΡƒΠΆΠ½Π°Ρ» Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π‘ΠΎΠ»Π΅Π΅ простыми словами, соль — это кусочСк Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ ваши Ρ…Π΅ΡˆΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ устойчивыми ΠΊ Π²Π·Π»ΠΎΠΌΡƒ. БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ½Π»Π°ΠΉΠ½-сСрвисов, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹Π΅ списки Π·Π°Ρ€Π°Π½Π΅Π΅ вычислСнных Ρ…Π΅ΡˆΠ΅ΠΉ вмСстС с ΠΈΡ… ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ. ИспользованиС соли Π΄Π΅Π»Π°Π΅Ρ‚ поиск Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ…Π΅ΡˆΠ° Π² Ρ‚Π°ΠΊΠΎΠΌ спискС маловСроятным ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ.

password_hash() создаёт ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ соль Π² случаС, Ссли ΠΎΠ½Π° Π½Π΅ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π°, ΠΈ Ρ‡Π°Ρ‰Π΅ всСго это Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ ΠΈ бСзопасный Π²Ρ‹Π±ΠΎΡ€.

Как я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свою соль?

ΠŸΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ password_hash() ΠΈΠ»ΠΈ crypt(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ содСрТит соль ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ созданного Ρ…Π΅ΡˆΠ°. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ Π² вашСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ содСрТит Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая использовалась, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ password_verify() ΠΈΠ»ΠΈ crypt() ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ пароля.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния функциями crypt() ΠΈΠ»ΠΈ password_hash(). Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΎΠ½ΠΈ содСрТат ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ ΠΈ соли, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пароля.

οΌ‹add a note

User Contributed Notes 4 notes

up

down

144

alf dot henrik at ascdevel dot com ΒΆ

8 years ago

I feel like I should comment some of the clams being posted as replies here.

For starters, speed IS an issue with MD5 in particular and also SHA1. I've written my own MD5 bruteforce application just for the fun of it, and using only my CPU I can easily check a hash against about 200mill. hash per second. The main reason for this speed is that you for most attempts can bypass 19 out of 64 steps in the algorithm. For longer input (> 16 characters) it won't apply, but I'm sure there's some ways around it. 8 = 7,21389578984e+15 combinations.
With 100 billion per second it would then take 7,21389578984e+15 / 3600 = ~20 hours to figure out what it actually says. Keep in mind that you'll need to add the numbers for 1-7 characters as well. 20 hours is not a lot if you want to target a single user.

So on essence:
There's a reason why newer hash algorithms are specifically designed not to be easily implemented on GPUs.

Oh, and I can see there's someone mentioning MD5 and rainbow tables. If you read the numbers here, I hope you realize how incredibly stupid and useless rainbow tables have become in terms of MD5. Unless the input to MD5 is really huge, you're just not going to be able to compete with GPUs here. By the time a storage media is able to produce far beyond 3TB/s, the CPUs and GPUs will have reached much higher speeds.

As for SHA1, my belief is that it's about a third slower than MD5. I can't verify this myself, but it seems to be the case judging the numbers presented for MD5 and SHA1. The issue with speeds is basically very much the same here as well.

The moral here:
Please do as told. Don't every use MD5 and SHA1 for hasing passwords ever again. We all know passwords aren't going to be that long for most people, and that's a major disadvantage. Adding long salts will help for sure, but unless you want to add some hundred bytes of salt, there's going to be fast bruteforce applications out there ready to reverse engineer your passwords or your users' passwords.

up

down

27

swardx at gmail dot com ΒΆ

6 years ago

A great read..

https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/

Serious Security: How to store your users’ passwords safely

In summary, here is our minimum recommendation for safe storage of your users’ passwords:

Β  Β  Use a strong random number generator to create a salt of 16 bytes or longer.
Β  Β  Feed the salt and the password into the PBKDF2 algorithm.
Β  Β  Use HMAC-SHA-256 as the core hash inside PBKDF2.
Β  Β  Perform 20,000 iterations or more. (June 2016.)
Β  Β  Take 32 bytes (256 bits) of output from PBKDF2 as the final password hash.
Β  Β  Store the iteration count, the salt and the final hash in your password database.
Β  Β  Increase your iteration count regularly to keep up with faster cracking tools.

Whatever you do, don’t try to knit your own password storage algorithm.

up

down

2

tamas at microwizard dot com ΒΆ

1 year ago

While I am reading the comments some old math lessons came into my mind and started thinking. Using constants in a mathematical algorythms do not change the complexity of the algorythm itself.

The reason of salting is to avoid using rainbow tables (sorry guys this is the only reason) because it speeds up (shortcuts) the "actual" processing power.
(((Longer stored hashes AND longer password increases complexity of cracking NOT adding salt ALONE.)))

PHP salting functions returns all the needed information for checking passwords, therfore this information should be treated as constant from farther point of view. It is also a target for rainbow tables (sure: for much-much larger ones).

What is the solution?
The solution is to store password hash and salt on different places.
The implementation is yours. Every two different places will be good enough.

Yes, it will make problems for hackers. He/she needs to understand your system. No speed up for password cracking will work for him/her without reimplementing your whole system.

This is my two cent.

up

down

4

fluffy at beesbuzz dot biz ΒΆ

10 years ago

The security issue with simple hashing (md5 et al) isn't really the speed, so much as the fact that it's idempotent; two different people with the same password will have the same hash, and so if one person's hash is brute-forced, the other one will as well. Β  This facilitates rainbow attacks.Β  Simply slowing the hash down isn't a very useful tactic for improving security.Β  It doesn't matter how slow and cumbersome your hash algorithm is - as soon as someone has a weak password that's in a dictionary, EVERYONE with that weak password is vulnerable.

Also, hash algorithms such as md5 are for the purpose of generating a digest and checking if two things are probably the same as each other; they are not intended to be impossible to generate a collision for.Β  Even if an underlying password itself requires a lot of brute forcing to determine, that doesn't mean it will be impossible to find some other bit pattern that generates the same hash in a trivial amount of time.

As such: please, please, PLEASE only use salted hashes for password storage.Β  There is no reason to implement your own salted hash mechanism, either, as crypt() already does an excellent job of this.

οΌ‹add a note

Π₯эш-функция Π² повсСднСвной ΠΆΠΈΠ·Π½ΠΈ β€” NTA Π½Π° vc.

ru

Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ…ΡΡˆ-функция создаСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ ΠΈΠ· исходной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π˜Ρ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ…ΡΡˆ-суммой ΠΈΠ»ΠΈ просто Ρ…ΡΡˆΠ΅ΠΌ.

3130 просмотров

Как ΠΆΠ΅ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Π₯эш-функция Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π°ΡΡ‚ΡŒ тСкста ΠΈΠ»ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΎΡ‚ вашСго Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² строку ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. Π­Ρ‚Π° строка всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Ρ‹Π»Π° входная информация. БущСствуСт достаточно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ…Π΅Ρˆ- Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². НапримСр, слово bitcoin, ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ΅ Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡΡˆ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ sha-256 Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ.

Π₯эш-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ.

Π—Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π² ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ AES Π²Ρ‹ всСгда с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ„Ρ€Π°Π·Ρ‹ смоТСтС Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ. Π₯эш-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону. ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΠ² ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, свой ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π²Ρ‹ Π½Π΅ смоТСтС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, зная Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ°. Π­Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Ρ…ΡΡˆ-функциям. Π₯эш-функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ однонаправлСнная. ПозТС ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ‡Π΅Π³ΠΎ это Π½ΡƒΠΆΠ½ΠΎ.

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ основноС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ для Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ…ΡΡˆΠ°, Π²Π½Π΅ зависимости ΠΎΡ‚ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. БСйчас ΠΏΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π° с нСсколькими исходными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Ρ…ΡΡˆΠ°ΠΌΠΈ.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅ исходная информация Ρ€Π°Π·Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ…ΡΡˆ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ. Π’ любом ΠΈΠ· случаСв ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ кэша ΠΈ практичСски ΠΏΠΎΠ»Π½ΠΎΠ΅ отсутствиС ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ. Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚? Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ°.

Коллизии ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ Π² Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… Ρ…Π΅Ρˆ- функциях частота возникновСния ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ Π±Π»ΠΈΠ·ΠΊΠ° ΠΊ тСорСтичСскому ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ. НапримСр, Ρ…ΡΡˆ-функция md5 сСйчас стала Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ устойчива ΠΊ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ.

ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ стали Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΡ‰Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΡ‚ΠΈ коллизию Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ΅ врСмя Π½Π΅ составит Ρ‚Ρ€ΡƒΠ΄Π°. ΠŸΡ€ΡΠΌΠΎ сСйчас Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ для Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ md5. Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ объясним, ΠΊΠ°ΠΊ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ. Π₯эш-функция Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ быстрой ΠΈ быстро Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Но, это Ρ‚Π°ΠΊ ΠΆΠ΅ являСтся ΠΈ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ для «брутфорса», Ρ‚Π°ΠΊ Ρ‡Π΅ΠΌ быстрСС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΡΡˆ-функция, Ρ‚Π΅ΠΌ большС ΠΎΠ½Π° уязвима для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°. Для Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ криптографичСской Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π»Π°Π²ΠΈΠ½Π½ΠΎΠ³ΠΎ эффСкта. Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚? Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° Π² исходной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ…Π΅Ρˆ помСняСтся ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ.

Как ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ идСальная криптографичСская Ρ…ΡΡˆ-функция? ИдСалом криптографичСской Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присущи ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡΡ‚ΡŒ свойств:

  1. Π”Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ всСгда Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ°.
  2. Высокая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ вычислСния Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· любого сообщСния.
  3. ΠžΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ β€” Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исходноС сообщСниС, зная Π΅Π³ΠΎ Ρ…ΡΡˆ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°.
  4. НаличиС Π»Π°Π²ΠΈΠ½Π½ΠΎΠ³ΠΎ эффСкта – минимальноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² исходном сообщСнии ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ измСнСнию Ρ…ΡΡˆΠ°.
  5. ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° для Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… сообщСний.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹

Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ΡΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π’ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти. Π’Π°Ρˆ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ пропускаСтся Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ значСния Ρ…ΡΡˆΠ° Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. ПослС рСгистрации, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для Π²Ρ…ΠΎΠ΄Π° ΠΎΠ½ΠΈ ΠΎΠΏΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° сравниваСтся с Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ…ΡΡˆΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ записано Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ, послС вашСй рСгистрации, Ссли значСния ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, систСма вас Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΡƒΠ΅Ρ‚. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Ρ‚ΠΎ выскакиваСт ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ возвращаСмся ΠΊ основному Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” однонаправлСнности. ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ, Π²Π·Π»ΠΎΠΌΠ°Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ…ΡΡˆΠ΅ΠΉ, Π½ΠΎ Π½Π΅ чистыС Π»ΠΎΠ³ΠΈΠ½Ρ‹ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ. ИмСнно ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ…ΡΡˆ-функция однонаправлСнная, ΠΈΠ· Π½Π΅Π΅ нСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исходныС Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ Π»ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Ρ…ΡΡˆΠΈ всС-Ρ‚Π°ΠΊΠΈ смоТСт ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Π°ΠΊΠ° ΠΏΠΎ Β«Ρ€Π°Π΄ΡƒΠΆΠ½Ρ‹ΠΌΒ» Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ.

Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π·Π°Ρ€Π°Π½Π΅Π΅ вычислСнныС Ρ…ΡΡˆΠΈ для простых ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ Ρ…ΡΡˆΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ…ΡΡˆΠ°ΠΌΠΈ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти. Но Ρ‚ΡƒΡ‚ появляСтся ΠΎΠ΄Π½Π° такая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ…ΡΡˆ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ получаСтся Ρ‚ΠΎΠΆΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ маловСроятно Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Однако, Π²ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ самых популярных ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π·Π° 2020 Π³ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… сСрвисах.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Ρ…Π΅ΡˆΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π° нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ «соль».

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ «соль»? «Боль»- это строка Π΄Π°Π½Π½Ρ‹Ρ… которая пропускаСтся Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСстС с ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ.

ИспользованиС «соли» ΠΏΡ€ΠΈ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… паролях Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½ΠΎΠ΅. Допустим, Ссли Алиса ΠΈ Π‘ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ qwerty. Π₯эш этих ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»Π° использована «соль».

Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π·Π°Ρ€Π°Π½Π΅Π΅ Ρ…ΡΡˆΠ΅ΠΉ. Для самых популярных ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° сайтС Β«crackstationΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ пропустим самый часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ qwerty Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sha-256.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ°. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° вставляСм Π½Π° сайт Β«crackstationΒ» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ qwerty. Π­Ρ‚ΠΎ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ ΠΈ вычислили исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρƒ этого сайта Π΅ΡΡ‚ΡŒ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… с ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ Ρ…ΡΡˆΠ°ΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ простого ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ пароля.

Но использованиС «соли» Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΎΠ². Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ всС Π΅Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° Ρ‡Π΅Ρ€Π΅Π· «брутфорс» ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€. Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ понадобится большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния «соли». Но тСорСтичСски это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ основноС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. А ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ всСгда являСтся прСимущСством, особСнно ΠΊΠΎΠ³Π΄Π° это касаСтся хранСния ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ «брутфорса».

Π’Π°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π° вычислСниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ Π½Π° вычислСниС стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: decrypt, sckrypt ΠΈΠ»ΠΈ argon2. Π˜Ρ… использованиС для хранСния ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ «брутфорс» (Brute-force Attack). Π’Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для создания сСкрСтного ΠΊΠ»ΡŽΡ‡Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит ΠΈΠ· пароля ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, «соли», ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cost. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ cost Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ Β«Ρ€Π°Π΄ΡƒΠΆΠ½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Β».

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ cost опрСдСляСт количСство Ρ†ΠΈΠΊΠ»ΠΎΠ², Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π° исходная информация ΠΈ это замСдляСт процСсс Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Ρ‚Π°ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° становится Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСсс Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ сильно Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ ΠΈ Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ΅ врСмя Π½Π΅ получится ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ достаточноС количСство ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ всСвозмоТных ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ «соли».

Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ станут ΠΌΠΎΡ‰Π½Π΅Π΅ ΠΈ Π°Ρ‚Π°ΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π½Π° этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ смогут быстрСС Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ своСй Ρ†Π΅Π»ΠΈ. Для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ просто ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ cost, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт количСство Ρ†ΠΈΠΊΠ»ΠΎΠ².

Π§Π΅ΠΌ большС Ρ†ΠΈΠΊΠ»ΠΎΠ², Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ потрСбуСтся для Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ исходной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сСрвис dropbox. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ dropbox Π±Π΅Ρ€Ρ‘Ρ‚ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π΅Π· использования «соли». И Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ…ΡΡˆ пропускаСтся Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ BCrypt с использованиСм «соли» ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ cost Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π² 10 Ρ†ΠΈΠΊΠ»ΠΎΠ². Π­Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ брутфорса (Brute-force Attack). Π’Π°ΠΊ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ вся эта информация ΡˆΠΈΡ„Ρ€ΡƒΠ΅Ρ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ aes. Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΡƒ придСтся Π²ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ всС эти слои Π·Π°Ρ‰ΠΈΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠΉ Π΅ΠΌΡƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Однако, стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ слабыС ΠΏΠ°Ρ€ΠΎΠ»ΠΈ всС Ρ€Π°Π²Π½ΠΎ уязвимы. Π”Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ

ΠŸΠ°Ρ€ΠΎΠ»ΡŒ, ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ…ΡΡˆ-функция md5 Π±ΡƒΠ΄Π΅Ρ‚ слоТнСС ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ

Ρ‡Π΅ΠΌ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈΠ· 6 символов, Π½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ BCrypt с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ cost Π² 25 Ρ†ΠΈΠΊΠ»ΠΎΠ².

Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ‰ΠΈΡ‚Π° ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π½Π΅ СдинствСнная сфСра Π³Π΄Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Они Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ цСлостности Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅. ΠŸΡ€ΠΈ малСйшСм ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ исходного Ρ„Π°ΠΉΠ»Π° Π΅Π³ΠΎ Ρ…ΡΡˆ-сумма ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ измСняСтся. Как это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано? Π‘Π°ΠΌΡ‹ΠΉ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, скачСнного с сайта Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния рядом со ссылкой Π½Π° скачиваниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Ρ…ΡΡˆ-сумму ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ². ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ПО Π½Π° свой ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ…ΡΡˆΠΈ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Π»ΠΈΡΡŒ измСнСнию. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ использовано для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ двумя людьми, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² процСссС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ½ Π½Π΅ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Но здСсь ΠΏΡ€ΠΈ использовании Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ мСсто Π±Ρ‹Ρ‚ΡŒ коллизионная Π°Ρ‚Π°ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ…Π΅Ρˆ.

Как происходит коллизионная Π°Ρ‚Π°ΠΊΠ°. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π•Π²Π° создаСт Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Β«Π°Β» ΠΈ Β«Π±Β» ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆ суммы. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π•Π²Π° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΎΠ±ΠΌΠ°Π½ΡƒΡ‚ΡŒ Π‘ΠΎΠ±Π°, Π²Ρ‹Π΄Π°Π² свой Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π·Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Алисы. Π•Π²Π° отсылаСт Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ АлисС, которая довСряСт ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, подписываСт Π΅Π³ΠΎ Ρ…ΡΡˆ ΠΈ отсылаСт подпись Π•Π²Π΅. Π•Π²Π° прикрСпляСт подпись Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Β«Π°Β» ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ Β«Π±Β» Π·Π°Ρ‚Π΅ΠΌ отправляСт подпись ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π‘ΠΎΠ±Ρƒ утвСрТдая, Ρ‡Ρ‚ΠΎ Алиса подписала этот Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСктронная подпись свСряСт лишь Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Β«Π±Β», Π‘ΠΎΠ± Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΎ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅.

Π‘ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ криптографичСскими Ρ…ΡΡˆ-функциями Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ с ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ md5 это Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ.

Π₯эш-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅, каТдая транзакция Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Π° содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»Π΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅. О суммС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΅Ρ‘ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Вся эта информация Ρ…ΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΈ образуСтся Β«Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡˆΠΈΠ½ IDΒ». Β«Π’Ρ€Π°Π½Π·Π°ΠΊΡˆΠΈΠ½ IDΒ» это Ρ…ΡΡˆ-сумма, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΅Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ эта транзакция ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π°. Π₯эши Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ Π² Π±Π»ΠΎΠΊΠ°Ρ… Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°, Π±ΠΈΡ‚ΠΊΠΎΠΈΠ½Π°, содСрТит свой Ρ…ΡΡˆ ΠΈ Ρ…ΡΡˆ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ примСнСния Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля BCrypt.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ bcrypt Π² PyPi ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ BCrypt, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· pip:

pip install bcrypt

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ установили BCrypt с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

import bcrypt

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Β«PasswordnewΒ» Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° пароля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² использованиС BCrypt:

pwd = ‘Passwordnew’ bytePwd = password.encode(‘utf-8’)

Π₯Π΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ BCrypt:

# Generate salt mySalt = bcrypt.gensalt() # Hash password hash = bcrypt.hashpw(bytePwd, mySalt)

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ тСкстовый ΠΏΠ°Ρ€ΠΎΠ»ΡŒ допустимым ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ для Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ…ΡΡˆΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создали Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

print(bcrypt.checkpw(password, hash)) # Output: True

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для наглядности Π±Ρ‹Π» ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ процСсс Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ пароля Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ BCrypt.

НадСюсь, Ρ‡Ρ‚ΠΎ Ρƒ вас слоТилось прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ…ΡΡˆ-функция, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ — ΠšΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ

Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β (ΠΈΠ½ΠΎΠ³Π΄Π°Β Β«Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β»,Β Π°Π½Π³Π».Β hashing)Β β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΒ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒΒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽΒ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽΒ ΡΡ‚Ρ€ΠΎΠΊΡƒ фиксированной Π΄Π»ΠΈΠ½Ρ‹. Π’Π°ΠΊΠΈΠ΅ прСобразования Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡΒ Ρ…Π΅Ρˆ-функциями или функциями свёртки, Π° ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚Β Ρ…Π΅ΡˆΠ΅ΠΌ,Β Ρ…Π΅Ρˆ-кодом или сводкой сообщСния(Π°Π½Π³Π».Β message digest).

Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ примСняСтся для построСния ассоциативных массивов, поиска Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π² сСриях Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, построСния достаточно ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² для Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠ΅ суммированиС с Ρ†Π΅Π»ΡŒΡŽ обнаруТСния случайных ΠΈΠ»ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹Ρ… ошибок ΠΏΡ€ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅, для хранСния ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² систСмах Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (Π² этом случаС доступ ΠΊ области памяти, Π³Π΄Π΅ находятся ΠΏΠ°Ρ€ΠΎΠ»ΠΈ, Π½Π΅ позволяСт Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сам ΠΏΠ°Ρ€ΠΎΠ»ΡŒ), ΠΏΡ€ΠΈ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ элСктронной подписи (Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ часто подписываСтся Π½Π΅ само сообщСниС, Π° Π΅Π³ΠΎ Ρ…Π΅Ρˆ-ΠΎΠ±Ρ€Π°Π·).

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ³ΠΎ соотвСтствия ΠΌΠ΅ΠΆΠ΄Ρƒ исходными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ΠΎΠΌ Π½Π΅Ρ‚ Π² силу Ρ‚ΠΎΠ³ΠΎ, что количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ мСньшС, Ρ‡Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива; сущСствуСт мноТСство массивов с Ρ€Π°Π·Π½Ρ‹ΠΌ содСрТимым, Π½ΠΎ Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄Ρ‹Β β€” Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅Β ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ. Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ возникновСния ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² ΠΎΡ†Π΅Π½ΠΊΠ΅ качСства Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

БущСствуСт мноТСство Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ свойствами (Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ,Β Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ,Β ΠΊΡ€ΠΈΠΏΡ‚ΠΎΡΡ‚ΠΎΠΉΠΊΠΎΡΡ‚ΡŒΒ ΠΈΒ Ρ‚.Β ΠΏ.). Π’Ρ‹Π±ΠΎΡ€ Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ опрСдСляСтся спСцификой Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒΒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма или CRC.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

Π”ΠΎΠ½Π°Π»ΡŒΠ΄ ΠšΠ½ΡƒΡ‚Β ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΡΠΈΡΡ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ идСю Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊ сотруднику IBMΒ Π₯ансу ΠŸΠ΅Ρ‚Π΅Ρ€Ρƒ Π›ΡƒΠ½ΡƒΒ (Π½Π΅ΠΌ.Β Hans Peter Luhn), ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ²ΡˆΠ΅ΠΌΡƒ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² январС 1953 Π³ΠΎΠ΄Π°.

Π’ 1956 Π³ΠΎΠ΄ΡƒΒ ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Π”ΡƒΠΌΠΈΒ (Π°Π½Π³Π».Β Arnold Dumey) Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅ Β«Computers and automationΒ» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ прСдставил ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ, ΠΊΠ°ΠΊΠΎΠΉ Π΅Ρ‘ Π·Π½Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов сСйчас. Π”ΡƒΠΌΠΈ рассматривал Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Β«ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ словаря», Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Ρ…Π΅Ρˆ-адрСса остаток дСлСния Π½Π° простоС число.[1]

ΠŸΠ΅Ρ€Π²ΠΎΠΉ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ, связанной с поиском Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ…, Π±Ρ‹Π»Π° ΡΡ‚Π°Ρ‚ΡŒΡΒ Π£ΡΡΠ»ΠΈ ΠŸΠΈΡ‚Π΅Ρ€ΡΠΎΠ½Π°Β (Π°Π½Π³Π».Β W. Wesley Peterson) Π²Β IBM Journal of Research and DevelopmentΒ 1957 Π³ΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π» Π½Π° ΡƒΡ…ΡƒΠ΄ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ. Бпустя ΡˆΠ΅ΡΡ‚ΡŒ Π»Π΅Ρ‚ Π±Ρ‹Π»Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Β Π’Π΅Ρ€Π½Π΅Ρ€Π° Π‘ΡƒΡ…Π³ΠΎΠ»ΡŒΡ†Π°Β (Π½Π΅ΠΌ.Β Werner Buchholz), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠ΅ исслСдованиС Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π»Π΅Ρ‚ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ использовалось, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… Ρ€Π°Π±ΠΎΡ‚.

Π’ 1967 Π³ΠΎΠ΄Ρƒ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² соврСмСнном Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ упомянуто Π² ΠΊΠ½ΠΈΠ³Π΅ Π₯Π΅Ρ€Π±Π΅Ρ€Ρ‚Π° Π₯Π΅Π»Π»Π΅Ρ€ΠΌΠ°Π½Π° Β«ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм». Π’ 1968 Π³ΠΎΠ΄ΡƒΒ Π ΠΎΠ±Π΅Ρ€Ρ‚ ΠœΠΎΡ€Ρ€ΠΈΡΒ (Π°Π½Π³Π».Β Robert Morris) ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» Π²Β Communications of the ACM большой ΠΎΠ±Π·ΠΎΡ€ ΠΏΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, эта Ρ€Π°Π±ΠΎΡ‚Π° считаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ, вводящСй понятиС ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² Π½Π°ΡƒΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΠΈ Π·Π°ΠΊΡ€Π΅ΠΏΠΈΠ²ΡˆΠ΅ΠΉ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ²ΡˆΠΈΠΉΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΆΠ°Ρ€Π³ΠΎΠ½Π΅ спСциалистов Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«Ρ…Π΅ΡˆΒ».

Π”ΠΎ Π½Π°Ρ‡Π°Π»Π° 1990-Ρ… Π³ΠΎΠ΄ΠΎΠ² Π² русскоязычной Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ Π² качСствС эквивалСнта Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρƒ Β«Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» благодаря работам АндрСя Π•Ρ€ΡˆΠΎΠ²Π°Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΎΡΡŒ слово «расстановка», Π° для ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ использовался Ρ‚Π΅Ρ€ΠΌΠΈΠ½ «ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚» (Π•Ρ€ΡˆΠΎΠ² использовал «расстановку» с 1956 Π³ΠΎΠ΄Π°, Π² русскоязычном ΠΈΠ·Π΄Π°Π½ΠΈΠΈ книги Вирта «Алгоритмы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…Β» 1989 Π³ΠΎΠ΄Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ «расстановка»). ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π»ΠΎΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ русским ΡΠ»ΠΎΠ²ΠΎΠΌΒ Β«ΠΎΠΊΡ€ΠΎΡˆΠΊΠ°Β». Однако Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π΅ приТился, ΠΈ Π² русскоязычной Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прСимущСствСнно Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β».[3]

Π’ΠΈΠ΄Ρ‹ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ Ρ…Π΅Ρˆ-функция Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ Π΄Π²ΡƒΠΌ свойствам:

  1. Быстро Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ;
  2. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство коллизий

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, для опрСдСлённости, Ρ‡Ρ‚ΠΎ количСство ΠΊΠ»ΡŽΡ‡Π΅ΠΉΒ , Π° Ρ…Π΅Ρˆ-функция  имССт Π½Π΅ Π±ΠΎΠ»Π΅Π΅Β Β Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Β«ΠΏΠ»ΠΎΡ…ΠΎΠΉΒ» Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ привСсти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с , которая Π΄Π΅ΡΡΡ‚ΠΈΠ·Π½Π°Ρ‡Π½ΠΎΠΌΡƒΒ Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠΌ числу  сопоставляСт Ρ‚Ρ€ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΠΈΠ· сСрСдины Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΠΈΠ·Π½Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° числа . Казалось Π±Ρ‹ значСния Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Β«000Β» ΠΈ Β«999Β», Π½ΠΎ для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ лишь Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ большого количСства Π½ΡƒΠ»Π΅ΠΉ слСва ΠΈΠ»ΠΈ справа.[3]

Однако сущСствуСт нСсколько Π±ΠΎΠ»Π΅Π΅ простых ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π₯Сш-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, основанныС Π½Π° Π΄Π΅Π»Π΅Π½ΠΈΠΈ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² качСствС Ρ…Π΅ΡˆΠ° остаток ΠΎΡ‚ дСлСния Π½Π°Β , Π³Π΄Π΅Β Β — это количСство всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ…Π΅ΡˆΠ΅ΠΉ:

ΠŸΡ€ΠΈ этом ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‡Ρ‘Ρ‚Π½ΠΎΠΌΒ Β Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Ρ‘Ρ‚Π½Ρ‹ΠΌ, ΠΏΡ€ΠΈ Ρ‡Ρ‘Ρ‚Π½ΠΎΠΌΒ , ΠΈ Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹ΠΌΒ β€” ΠΏΡ€ΠΈ Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π°Ρ…. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Β Β ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ основания счислСния ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ†ΠΈΡ„Ρ€ числа , располоТСнных справа, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ количСству ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚Β ΠΏΡ€ΠΎΡΡ‚ΠΎΠ΅Β Β β€” Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв этот Π²Ρ‹Π±ΠΎΡ€ Π²ΠΏΠΎΠ»Π½Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»Π΅Π½.

Π•Ρ‰Ρ‘ слСдуСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, основанном Π½Π° Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π° ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π΄Π²Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅Β Β Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π΄Π²ΠΎΠΉΠΊΠΈ, Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ () ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΎΠ². Π’ этом случаС Π² качСствС Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄Π° бСрутся значСния коэффциСнтов ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ остаток ΠΎΡ‚ дСлСния  на Π·Π°Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ полином  стСпСни :

ΠŸΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π²Ρ‹Π±ΠΎΡ€Π΅Β Β Ρ‚Π°ΠΊΠΎΠΉ способ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ отсутствиС ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.[3]

ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Π°Ρ схСма Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ состоит Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ†Π΅Π»ΠΎΠΉ константы , Π²Π·Π°ΠΈΠΌΠ½ΠΎ простой с , Π³Π΄Π΅Β Β β€” количСство прСдставимых ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ словом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…Β IBM PCΒ ). Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·ΡΡ‚ΡŒ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²ΠΈΠ΄Π°:

Π’ этом случаС, Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ с Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмой счислСния,  являСтся ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΈΒ Β Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΡΡ‚Π°Ρ€ΡˆΠΈΡ… Π±ΠΈΡ‚ΠΎΠ² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ произвСдСния .

Π‘Ρ€Π΅Π΄ΠΈ прСимущСств этих Π΄Π²ΡƒΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ нСслучайны, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Ρ‚ΠΎΠΌ случаС Ссли ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡΠΎΠ±ΠΎΠΉΒ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽΒ (допустим ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΡ‘Π½ «ИМЯ1Β», «ИМЯ2Β», «ИМЯ3Β»). ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽ Π² ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ количСство ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со случайной ситуациСй.[3]

Одной ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° являСтся Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ, основанноС Π½Π° свойствах золотого сСчСния. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Β Β Π·Π΄Π΅ΡΡŒ выбираСтся блиТайшСС ΠΊΒ Β Ρ†Π΅Π»ΠΎΠ΅ число, Π²Π·Π°ΠΈΠΌΠ½ΠΎ простоС с 

Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строк ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹

Π’Ρ‹ΡˆΠ΅ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΈ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ, состоящиС ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… слов ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. НапримСр ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слова Π² ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ слоТСния ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽΒ Β ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Β«ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ ΠΈΠ»ΠΈΒ». Одним ΠΈΠ· Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ являСтся Ρ…Π΅Ρˆ-функция ΠŸΠΈΡ€ΡΠΎΠ½Π°.

Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠŸΠΈΡ€ΡΠΎΠ½Π°Β (Π°Π½Π³Π».Β Pearson hashing)Β β€” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠŸΠΈΡ‚Π΅Ρ€ΠΎΠΌ ΠŸΠΈΡ€ΡΠΎΠ½ΠΎΠΌ (Π°Π½Π³Π».Β Peter Pearson) для процСссоров с 8-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ рСгистрами, Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся быстроС вычислСниС Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄Π° для строки ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. На Π²Ρ…ΠΎΠ΄ функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ слово , состоящСС из  символов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 1 Π±Π°ΠΉΡ‚, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 255. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄Π° зависит ΠΎΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ слова.

Алгоритм ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ псСвдокодом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ строку  и ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ пСрСстановок 

h := 0
for each c in W loop
  index := h xor c
  h := T[index]
end loop
return h

Π‘Ρ€Π΅Π΄ΠΈ прСимущСств Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ:

  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Ρƒ вычислСния;
  • НС сущСствуСт Ρ‚Π°ΠΊΠΈΡ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ наибольшая;
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΡƒΡŽ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ способа Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ,  состоящих из  символов (), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ вычислСниС

ИдСальноС Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ИдСальной Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (Π°Π½Π³Π».Β Perfect hash function) называСтся такая функция, которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π°Β Β Π² мноТСство цСлых чисСл бСз коллизий. Π’ матСматичСских Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΡΡ‚ΠΎΒ ΠΈΠ½ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅Β ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

ОписаниС
  1. Ѐункция  называСтся идСальной Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для , Ссли ΠΎΠ½Π° ΠΈΠ½ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½Π° Π½Π°Β ;
  2. Ѐункция  называСтся минимальной идСальной Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для , Ссли ΠΎΠ½Π° являСтся ИΠ₯Π€ ΠΈΒ ;
  3. Для Ρ†Π΅Π»ΠΎΠ³ΠΎΒ , функция  называСтся -идСальной Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (k-PHF) для  Ссли для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎΒ Β ΠΈΠΌΠ΅Π΅ΠΌΒ .

ИдСальноС Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ примСняСтся Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Ρƒ, Π±Π΅Π· сохранСния ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ»ΡŽΡ‡Π΅. Одним ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования идСального (ΠΈΠ»ΠΈ скорСС k-идСального) Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ являСтся ситуация, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ располагаСм нСбольшой быстрой ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π³Π΄Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ значСния Ρ…Π΅ΡˆΠ΅ΠΉ, связанных с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ хранящимися Π² большой, Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ памяти. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½Π°ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ памяти, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π·Π° ΠΎΠ΄ΠΈΠ½ запрос. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Β Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ…. Π’Π°ΠΊΠΆΠ΅ идСальноС Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π½Π° Π³Ρ€Π°Ρ„Π°Ρ…, Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° прСдставлСниС графа нС умСщаСтся Π² основной памяти.

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌΒ (Π°Π½Π³Π».Β Universal hashing) называСтся Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ ΠΎΠ΄Π½Π° конкрСтная Ρ…Π΅Ρˆ-функция, Π° происходит Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ сСмСйства ΠΏΠΎ случайному алгоритму. ИспользованиС ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ обСспСчиваСт Π½ΠΈΠ·ΠΊΠΎΠ΅ число ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ. Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ.

ОписаниС

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ из пространства  в числа . На Π²Ρ…ΠΎΠ΄Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…Β Β ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒΡŽΒ , ΠΏΡ€ΠΈΡ‡Π΅ΠΌ нСизвСстный Π·Π°Ρ€Π°Π½Π΅Π΅. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ†Π΅Π»ΡŒΡŽ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ являСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ наимСньшСго числа коллизий, Ρ‡Π΅Π³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’ качСствС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ сСмСйством .

БСзопасноС Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ | Руководство ΠΏΠΎ PHP

Π—Π° послСдниС 24 часа нас посСтили 7457 программистов ΠΈ 661 Ρ€ΠΎΠ±ΠΎΡ‚. БСйчас ΠΈΡ‰ΡƒΡ‚ 165 программистов …

Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ: Π§ΠΠ’Πž

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π°Π·ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, стоящиС Π·Π° Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² цСлях бСзопасности, Π° Ρ‚Π°ΠΊΠΆΠ΅ эффСктивныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

  1. ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ?
  2. ΠŸΠΎΡ‡Π΅ΠΌΡƒ популярныС Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ md5 ΠΈ sha1 Π½Π΅ подходят для ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ?
  3. Если популярныС Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ подходят, ΠΊΠ°ΠΊ ΠΆΠ΅ я Ρ‚ΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΠ°Ρ€ΠΎΠ»ΠΈ?
  4. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ соль?
  5. Как я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свою соль?
ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ?

Π₯ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… сообраТСний бСзопасности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π‘Π΅Π· Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠ°Ρ€ΠΎΠ»ΠΈ, хранящиСся Π² Π±Π°Π·Π΅ вашСго прилоТСния, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΡ€Π°Π΄Π΅Π½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли ваша Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ‹Π»Π° скомпромСтирована, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ для ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π°Ρ†ΠΈΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вашСго прилоТСния, Π½ΠΎ ΠΈ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… сСрвисах, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ паролям ΠΏΠ΅Ρ€Π΅Π΄ сохранСниСм ΠΈΡ… Π² своСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ€Π°Π·Π³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ пароля для Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Π°ΡˆΡƒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя сохраняя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сравнСния ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ…ΡΡˆΠ° с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ.

Π’Π°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ компромСтирования Π² вашСм Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° врСдоносного ΠΊΠΎΠ΄Π° Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ популярныС Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ md5() ΠΈ sha1() Π½Π΅ подходят для ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ?

Π’Π°ΠΊΠΈΠ΅ Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΊΠ°ΠΊ MD5, SHA1 ΠΈ SHA256 Π±Ρ‹Π»ΠΈ спроСктированы ΠΎΡ‡Π΅Π½ΡŒ быстрыми ΠΈ эффСктивными. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ соврСмСнных Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ оборудования, стало довольно просто Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ «Π³Ρ€ΡƒΠ±ΠΎΠΉ силы» для опрСдСлСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Из-Π·Π° Ρ‚ΠΎΠΉ скорости, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ соврСмСнныС ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ «ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ» эти Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ профСссионалы ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ бСзопасности строго Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

Если популярныС Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ подходят, ΠΊΠ°ΠΊ ΠΆΠ΅ я Ρ‚ΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΠ°Ρ€ΠΎΠ»ΠΈ?

ΠŸΡ€ΠΈ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ сущСствуСт Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… сообраТСния: это ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ вычислСния ΠΈ соль. Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ вычислСния Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ трСбуСтся для Π²Π·Π»ΠΎΠΌΠ° Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ «Π³Ρ€ΡƒΠ±ΠΎΠΉ силы».

PHP 5.5 прСдоставляСт встроСнноС API Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ бСзопасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ с Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ. Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ » PHP Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° совмСстимости, доступная с PHP 5.3.7.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ являСтся функция crypt(), которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² PHP 5.3 ΠΈ Π½ΠΎΠ²Π΅Π΅. ΠŸΡ€ΠΈ использовании этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ доступСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ PHP содСрТит ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Π΄Π°ΠΆΠ΅ Π² случаС, Ссли ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ вашСй систСмой.

ΠŸΡ€ΠΈ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ рСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Blowfish, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² API Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большСй Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ слоТности, Ρ‡Π΅ΠΌ MD5 ΠΈΠ»ΠΈ SHA1, ΠΏΡ€ΠΈ этом ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π³ΠΈΠ±ΠΎΠΊ.

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ crypt() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пароля, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅Ρ‡ΡŒ сСбя ΠΎΡ‚ Π°Ρ‚Π°ΠΊ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, примСняя сравнСниС строк, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ постоянноС врСмя. Ни ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ PHP == ΠΈ ===, Π½ΠΈ функция strcmp() Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ. Ѐункция ΠΆΠ΅ password_verify() ΠΊΠ°ΠΊ Ρ€Π°Π· Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ. ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнноС API Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Ссли Π΅ΡΡ‚ΡŒ такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ соль?

ΠšΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΠ°Ρ соль прСдставляСт собой Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² процСссС Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ для прСдотвращСния возмоТности Ρ€Π°Π·Π³Π°Π΄Π°Ρ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поиска Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² спискС Π·Π°Ρ€Π°Π½Π΅Π΅ вычислСнных ΠΏΠ°Ρ€ Π²Π²ΠΎΠ΄-Ρ…ΡΡˆ, извСстном Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ «Ρ€Π°Π΄ΡƒΠΆΠ½Π°Ρ» Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π‘ΠΎΠ»Π΅Π΅ простыми словами, соль — это кусочСк Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ ваши Ρ…ΡΡˆΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ устойчивыми ΠΊ Π²Π·Π»ΠΎΠΌΡƒ. БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ½Π»Π°ΠΉΠ½-сСрвисов, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹Π΅ списки Π·Π°Ρ€Π°Π½Π΅Π΅ вычислСнных Ρ…ΡΡˆΠ΅ΠΉ вмСстС с ΠΈΡ… ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ. ИспользованиС соли Π΄Π΅Π»Π°Π΅Ρ‚ поиск Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ…ΡΡˆΠ° Π² Ρ‚Π°ΠΊΠΎΠΌ спискС маловСроятным ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ.

password_hash() создаСт ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ соль Π² случаС, Ссли ΠΎΠ½Π° Π½Π΅ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π°, ΠΈ Ρ‡Π°Ρ‰Π΅ всСго это Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ ΠΈ бСзопасный Π²Ρ‹Π±ΠΎΡ€.

Как я Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свою соль?

ΠŸΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ password_hash() ΠΈΠ»ΠΈ crypt(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ содСрТит соль ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ созданного Ρ…ΡΡˆΠ°. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ Π² вашСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ содСрТит Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая использовалась, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ password_verify() ΠΈΠ»ΠΈ crypt() ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ пароля.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния функциями crypt() ΠΈΠ»ΠΈ password_hash(). Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΎΠ½ΠΈ содСрТат ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ ΠΈ соли, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пароля.

Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ: Π§ΠΠ’Πž

Π₯Сш-функция Π² C | Π’ΠΈΠΏΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π΅ΡΡ‚ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ (Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈ Ρ…ΡΡˆ-функция). НаиболСС Π²Π°ΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ являСтся «поиск», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ структуры Π΄Π°Π½Π½Ρ‹Ρ…, которая Π² срСднСм ΠΈΠΌΠ΅Π΅Ρ‚ врСмя O (1), Π° Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС это Π·Π°ΠΉΠΌΠ΅Ρ‚ врСмя O (n).

Π₯ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это ΠΌΠ΅Ρ‚ΠΎΠ΄ с Π±ΠΎΠ»Π΅Π΅ быстрым доступом ΠΊ элСмСнтам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сопоставляСт Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с мСньшим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ для сравнСния. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π² этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ ΠΊΠ°ΠΊ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ…Π΅Ρˆ-функция?

Π₯Сш-функция β€” это функция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ постоянного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для сохранСния ΠΈ извлСчСния значСния ΠΈΠ· Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ примСняСтся ΠΊ ΠΊΠ»ΡŽΡ‡Π°ΠΌ ΠΊΠ°ΠΊ Ρ†Π΅Π»Ρ‹Π΅ числа ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС адрСса для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

Π’ΠΈΠΏΡ‹ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π’ C

Π’ΠΈΠΏΡ‹ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ Π½ΠΈΠΆΠ΅:

1. ΠœΠ΅Ρ‚ΠΎΠ΄ дСлСния

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Ρ…Π΅Ρˆ-функция зависит ΠΎΡ‚ остатка ΠΎΡ‚ дСлСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Ρ€Π°Π²Π½Ρ‹ 42,78,89,64, ΠΈ возьмСм Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ€Π°Π²Π½Ρ‹ΠΌ 10.

Π₯эш (ΠΊΠ»ΡŽΡ‡) = элСмСнты % Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹;

2 = 42 % 10;

8 = 78 % 10;

9 = 89 % 10;

4 = 64 % 10;

Π’Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

2. ΠœΠ΅Ρ‚ΠΎΠ΄ срСднСго ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π² качСствС индСкса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ срСдняя Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ элСмСнта.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ для размСщСния Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅: 210, 350, 99 890 ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ 100.

210* 210 = 44100, индСкс = 1, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ срСдняя Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (44 1 00) Ρ€Π°Π²Π½Π° 1.

350* 350 = 122500, индСкс = 25 Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ срСдняя Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (12 25 00) Ρ€Π°Π²Π½Π° 25.

99* 99 = 9801, индСкс = 80 Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ срСдняя Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (9 80 1) Ρ€Π°Π²Π½Π° 80.

890* 890 = 792100, индСкс = 21, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ срСдняя Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (79 21 00) Ρ€Π°Π²Π½Π° 21.

3. ΠœΠ΅Ρ‚ΠΎΠ΄ слоТСния Ρ†ΠΈΡ„Ρ€

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, являСтся Ρ…Π΅Ρˆ-ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ получаСтся ΠΏΡƒΡ‚Π΅ΠΌ раздСлСния элСмСнтов Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ части, Π° Π·Π°Ρ‚Π΅ΠΌ объСдинСния частСй ΠΏΡƒΡ‚Π΅ΠΌ выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… простых матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ элСмСнты: 23576623, 34687734.

  • Ρ…Π΅Ρˆ (ΠΊΠ»ΡŽΡ‡) = 235+766+23 = 1024
  • Ρ…Π΅Ρˆ-ΠΊΠ»ΡŽΡ‡) = 34+68+77+34 = 213

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² этих Ρ‚ΠΈΠΏΠ°Ρ… Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρƒ нас Π΅ΡΡ‚ΡŒ числа ΠΎΡ‚ 1 Π΄ΠΎ 100 ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ = 10. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ = 23, 12, 32

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 23 % 10 = 3;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 12 % 10 = 2 ;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 32 % 10 = 2 ;

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° элСмСнта 12 ΠΈ 32 ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° 2-Π΅ мСсто Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π³Π΄Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Π° Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мСсто, такая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° извСстна ΠΊΠ°ΠΊ коллизия. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π’ΠΈΠΏΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ

Π”Π°Π²Π°ΠΉΡ‚Π΅ обсудим Ρ‚ΠΈΠΏΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ:

1. Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ°

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия, ΠΎΠ½ обСспСчиваСт Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Π±Π»ΠΎΠΊΠΎΠ² для записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, содСрТащСй Π΄Π²Π΅ записи элСмСнтов. . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° происходят Ρ‚Π°ΠΊΠΈΠ΅ столкновСния, поля Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ связанный список.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 23, 12, 32 с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ 10.

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 23 % 10 = 3;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 12 % 10 = 2 ;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 32 % 10 =2 ;

2. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Π°Ρ адрСсация
  • Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π·ΠΎΠ½Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ столкновСний. Как слСдуСт ΠΈΠ· названия, всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ коллизия, Π΄Π²Π° элСмСнта Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ пустоС мСсто ΠΈΠ»ΠΈ запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт. Π­Ρ‚ΠΎ снова ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅; Ссли ΠΌΡ‹ Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΡƒΡΡ‚ΡƒΡŽ запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ кластСризации. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это извСстно ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° кластСризации, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 23, 12, 32 с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ 10

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 23 % 10 = 3;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 12 % 10 =2 ;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 32 % 10 =2 ;

На этой Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ 12 ΠΈ 32 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ запись с индСксом 2, Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом ΠΎΠ½ΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ.

  • ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ кластСризации ΠΏΡ€ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ Π·ΠΎΠ½Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Ρ…ΡΡˆ-функция с Ρ…Π΅Ρˆ-ΠΊΠ»ΡŽΡ‡ΠΎΠΌ рассчитываСтся ΠΊΠ°ΠΊ Ρ…ΡΡˆ (ΠΊΠ»ΡŽΡ‡) = (Ρ…Π΅Ρˆ (ΠΊΠ»ΡŽΡ‡) + x * x) % Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (Π³Π΄Π΅ x = 0, 1, 2…).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 23, 12, 32 с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ 10

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 23 % 10 = 3;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 12 % 10 =2 ;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 32 % 10 =2 ;

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ 23 ΠΈ 12 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹, Π½ΠΎ 32 Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ снова 12 ΠΈ 32 ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ запись с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ индСксом Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, согласно этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Ρ…ΡΡˆ (ΠΊΠ»ΡŽΡ‡) = (32 + 1*1) % 10 = 3. Но Π² этом случаС запись Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с индСксом 3 помСщаСтся Π² 23, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x Π½Π° 1. Π₯эш (ΠΊΠ»ΡŽΡ‡) = (32 + 2 * 2) % 10 = 6. Π˜Ρ‚Π°ΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ 32 Π² запись с индСксом 6 Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

  • Π”Π²ΠΎΠΉΠ½ΠΎΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ 2 Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ рассчитываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° дСлСния. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ Π΄Π²ΡƒΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ; ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ 0, ΠΈ записи Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ.

  • 1 (ΠΊΠ»ΡŽΡ‡) = ΠΊΠ»ΡŽΡ‡ % Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.
  • 2 (ΠΊΠ»ΡŽΡ‡) = p – (ΠΊΠ»ΡŽΡ‡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ p), Π³Π΄Π΅ p β€” простыС числа < Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 23, 12, 32 с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ 10

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 23 % 10 = 3;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 12 % 10 =2 ;

Π₯эш (ΠΊΠ»ΡŽΡ‡) = 32 % 10 =2 ;

Π—Π΄Π΅ΡΡŒ снова элСмСнт 32 ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ hash3 (ΠΊΠ»ΡŽΡ‡) = 5 – (32 % 5) = 3. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, 32 ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² индСкс 5 Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, которая пуста, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³Π½ΡƒΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· 3 записи. Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Β  Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² поиска Π΄Π°Π½Π½Ρ‹Ρ…, обСспСчиваСмый ΠΎΡ‡Π΅Π½ΡŒ эффСктивными ΠΈ быстрыми ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ с использованиСм Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ любая другая структура Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ коэффициСнта.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ

Π­Ρ‚ΠΎ руководство ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² C. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ обсудили ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€, Ρ‚ΠΈΠΏΡ‹ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² C ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ Π² дСталях. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ наши Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС:

  1. Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π‘Π£Π‘Π”
  2. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ
  3. Π₯Сш-функция Π² Java
  4. Π₯Сш-функция Π² PHP

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² C | Π‘Π΅Π½Π½Π΅Ρ‚ Π‘ΡŒΡŽΠΊΠ΅Π½Π΅Π½

Если Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с языками сцСнариСв, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Python ΠΈΠ»ΠΈ Ruby, Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, извСстныС ΠΊΠ°ΠΊ массивы ΠΈ словари. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ способов доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² этих Ρ‚ΠΈΠΏΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Массив характСризуСтся упорядочСнной сСриСй элСмСнтов, Π° ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ характСризуСтся элСмСнтами с ΠΏΠ°Ρ€Π½Ρ‹ΠΌΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ использованиС словаря позволяСт Π½Π°ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сопоставлСниС ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ словаря. Π’ этом постС ΠΌΡ‹ построим Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ хранСния Π΄Π°Π½Π½Ρ‹Ρ…. Как ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, эта структура Π΄Π°Π½Π½Ρ‹Ρ… позволяСт ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΠΎΠ»Π΅Π΅ эффСктивно, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ индСксированный массив. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° прСдставляСт собой структуру Π΄Π°Π½Π½Ρ‹Ρ… с элСмСнтами массива с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Python, с Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… словаря, Π² C Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ индСксированныС массивы для Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ , Π½Π°ΠΌ потрСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… индСксированныС массивы. Для этого ΠΌΡ‹ создадим простой массив Π΄Π»ΠΈΠ½ΠΎΠΉ n , Π³Π΄Π΅ n β€” это количСство элСмСнтов Π² нашСй Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ . ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· элСмСнтов массива Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°: ΠΊΠ»ΡŽΡ‡ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ смоТСм Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π½Π° основС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΊΠ»ΡŽΡ‡Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ связанныС Π΄Π°Π½Π½Ρ‹Π΅ значСния .

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΌΡƒ объяснСнию Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ этого добьСмся, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ напишСм для построСния Π½Π°ΡˆΠΈΡ… Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° : ht_create(), ht_put(), ht_get(), ΠΈ ht_free() . ВсС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π° для этого Ρ…ΡΡˆΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ структуры Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ . W e Π½Π°Π·ΠΎΠ²Π΅Ρ‚ эти Π΄Π²Π΅ структуры List ΠΈ HashTable . List опрСдСляСт элСмСнт Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° указатСля Π½Π° наши строковыС Π΄Π°Π½Π½Ρ‹Π΅: ΠΊΠ»ΡŽΡ‡ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ . Π£ Π½Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ next Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° List (достаточно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ наш ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ next ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π½Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…). Вторая структура HashTable опрСдСляСт саму Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ , которая ΠΈΠΌΠ΅Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ массив элСмСнтов списка .

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² наши структуры, ΠΌΡ‹ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ht_create() , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для HashTable Π΄Π»ΠΈΠ½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создали Π½Π°ΡˆΡƒ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ , Π½Π°ΠΌ понадобится способ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π΅ элСмСнтами списка . Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ индСкс Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ , Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π­Ρ‚ΠΎ послуТит двоякой Ρ†Π΅Π»ΠΈ: Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ индСкса для Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΡŽ индСкса Ρ€Π°Π½Π΅Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Π° 9.0206 .

ΠœΡ‹ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ht_put() , которая создаСт Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² нашСй Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ , выдСляя ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта List с ΠΈΠΌΠ΅Π½Π΅ΠΌ node ΠΈ назначая строки, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ»ΡŽΡ‡Ρƒ . ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ , r соотвСтствСнно. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΡƒΠ·Π΅Π» , Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ node_handler() , которая вставляСт наши элСмСнты Π² список. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта функция Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ вставляла элСмСнт Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ индСкс массива, Π½ΠΎ ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ случай, ΠΊΠΎΠ³Π΄Π° индСкс ΡƒΠΆΠ΅ содСрТит Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² этом мСстС β€” случай, извСстный ΠΊΠ°ΠΊ 9. 0205 столкновСниС . Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΡ‹ создадим связанный список 90Β 205 90Β 206 элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΡ… ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΈΠ³Ρ€Ρƒ вступаСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ next нашСй структуры List , ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ устанавливаСм Π΅Π³ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° Ρ€Π°Π½Π΅Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ . Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ для вставки Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта списка Π² Π½Π°Ρ‡Π°Π»ΠΎ связанного списка . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ· 90Β 205 элСмСнтов списка 90Β 206 Π² этом индСксС массива, послСдний ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° NULL.

НаконСц, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ht_get() , которая ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ , ΠΊΠ°ΠΊ Π² нашСм словарС Python. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚ Π½Π°ΡˆΡƒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ индСксС массива элСмСнт списка с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ . Если ΠΎΠ½ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎ ΠΎΠ½ любСзно Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого элСмСнта .

Наша ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ†Π΅Π»ΡŒ достигнута, Π½ΠΎ наша Ρ€Π°Π±ΠΎΡ‚Π° Π΅Ρ‰Π΅ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°. К настоящСму ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ ΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠ»ΠΈ 72 Π±Π°ΠΉΡ‚Π° памяти для нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ Π·Π°Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² дСйствии, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, содСрТащий Ρ„Π°ΠΉΠ»Ρ‹ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ°, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ исслСдовали, ΠΈ запуститС исполняСмый Ρ„Π°ΠΉΠ». Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ½Π΅ нравится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для отслСТивания использования памяти ΠΌΠΎΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, называСтся valgrind, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π±Ρ‹Π»ΠΈ протСстированы с использованиСм Ubuntu 14.04.

 $ git clone https://github.com/bennettbuchanan/holbertonschool-low_level_programming$ cd holbertonschool-low_level_programming/example_hash_table/$ gcc -Wall -Wextra -Werror -pedantic main.c ht_put.c ht_create.c hash.c ht_get. c ht_free.c$ valgrind ./a.out 

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π±ΡƒΠΊΠ²Ρƒ C, ΠΈ valgrind сообщаСт Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ C β€” это вСсСло . Бпасибо, Ρ‡Ρ‚ΠΎ слСдитС Π·Π° Π½Π°ΠΌΠΈ!

Get-FileHash (Microsoft.PowerShell.Utility) β€” PowerShell | Microsoft Π£Π·Π½Π°ΠΉΡ‚Π΅

ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ связь Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π’Π²ΠΈΡ‚Ρ‚Π΅Ρ€ LinkedIn ЀСйсбук Π­Π». адрСс

  • β„– ΠΏΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ
ΠœΠΎΠ΄ΡƒΠ»ΡŒ:
Microsoft.PowerShell.Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π°

ВычисляСт Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ„Π°ΠΉΠ»Π° с использованиСм ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ…Π΅Ρˆ-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

Бинтаксис

 Get-File  Π₯эш
   [-ΠŸΡƒΡ‚ΡŒ] <Π‘Ρ‚Ρ€ΠΎΠΊΠ°[]>
   [[-Алгоритм] ]
   []  
 Get-File  Π₯эш
   [-LiteralPath] <Π‘Ρ‚Ρ€ΠΎΠΊΠ°[]>
   [[-Алгоритм] ]
   []  
 Get-File  Π₯эш
   [-InputStream] <ΠΏΠΎΡ‚ΠΎΠΊ>
   [[-Алгоритм] ]
   []  

ОписаниС

ΠšΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ Get-FileHash вычисляСт Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ…ΡΡˆ-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π₯эш-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” это ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ содСрТимому Ρ„Π°ΠΉΠ»Π°. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Ρ…Π΅Ρˆ присваиваСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ содСрТимому Ρ„Π°ΠΉΠ»Π°. ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π±Π΅Π· измСнСния содСрТимоС Ρ„Π°ΠΉΠ»Π° ΠΈ Π±Π΅Π· измСнСния Ρ…Π΅Ρˆ-значСния. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π±Π΅Π· измСнСния ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Однако ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°ΠΆΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа Π² содСрТимоС Ρ„Π°ΠΉΠ»Π° измСняСт Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°.

НазначСниС Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ криптографичСски бСзопасный способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ содСрТимоС Ρ„Π°ΠΉΠ»Π° Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. Π₯отя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ MD5 ΠΈ SHA1, большС Π½Π΅ считаСтся Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ, Ρ†Π΅Π»ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° бСзопасного Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π° β€” Π»ΠΈΠ±ΠΎ случайно, Π»ΠΈΠ±ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ нСсанкционированной ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ β€” ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΈ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ содСрТаниС. Если Ρ…ΡΡˆ-значСния Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹, содСрТимоС Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ Get-FileHash ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ SHA256, хотя любой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, поддСрТиваСтся Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ВычислСниС Ρ…ΡΡˆ-значСния для Ρ„Π°ΠΉΠ»Π°

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ Get-FileHash для вычислСния Ρ…ΡΡˆ-значСния для /etc/apt/sources.list Ρ„Π°ΠΉΠ». Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ…ΡΡˆ-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, SHA256 . Π’Ρ‹Ρ…ΠΎΠ΄ пСрСдаСтся Π² список Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² 9ΠšΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ 0388 для форматирования Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π²ΠΈΠ΄Π΅ списка.

 Get-FileHash /etc/apt/sources.list | Бписок Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²
Алгоритм: SHA256
Π₯эш: 3CBCFDDEC145E3382D592266BE193E5BE53443138EE6AB6CA09FF20DF609E268
ΠŸΡƒΡ‚ΡŒ: /etc/apt/sources.list 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. ВычислСниС Ρ…Π΅Ρˆ-значСния для Ρ„Π°ΠΉΠ»Π° ISO

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ Get-FileHash ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ SHA384 для вычислСния Ρ…ΡΡˆ-значСния для Ρ„Π°ΠΉΠ»Π° ISO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ администратор Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ» ΠΈΠ· Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°. Π’Ρ‹Π²ΠΎΠ΄ направляСтся Π² Format-List ΠšΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ для форматирования Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π²ΠΈΠ΄Π΅ списка.

 Get-FileHash C:\Users\user1\Downloads\Contoso8_1_ENT.iso -Алгоритм SHA384 | Бписок Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²
Алгоритм: SHA384
Π₯эш: 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3
ΠŸΡƒΡ‚ΡŒ: C:\Users\user1\Downloads\Contoso8_1_ENT.iso 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3. ВычислСниС Ρ…Π΅Ρˆ-значСния ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ System.Net.WebClient для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ· Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° выпуска Powershell. Π Π΅Π»ΠΈΠ· страница Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ…ΡΡˆ SHA256 ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅ΡˆΠ° с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ вычисляСм с Get-FileHash .

 $wc = [System.Net.WebClient]::new()
$pkgurl = 'https://github.com/PowerShell/PowerShell/releases/download/v6.2.4/powershell_6.2.4-1.debian.9_amd64.deb'
$publishedHash = '8E28E54D601F0751922DE24632C1E716B4684876255CF82304A9B19E89A9CCAC'
$FileHash = Get-FileHash-InputStream($wc. OpenRead($pkgurl))
$FileHash.Hash -eq $publishedHash
True 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4. ВычислСниС Ρ…ΡΡˆΠ° строки

PowerShell Π½Π΅ прСдоставляСт ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ для вычислСния Ρ…ΡΡˆΠ° строки. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ строку Π² ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ InputStream ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Get-FileHash для получСния Ρ…Π΅Ρˆ-значСния.

 $stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write("ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€")
$ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ.Flush()
$stringAsStream.Position = 0
Get-FileHash -InputStream $stringAsStream | Π₯Сш Select-Object
Π₯эш
----
64EC88CA00B268E5BA1A35678A1B5316D212F4F366B2477232534A8AECA37F3C 

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

-Алгоритм

-InputStream

-LiteralPath

-Path

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π‘Ρ‚Ρ€ΠΎΠΊΠ°

ΠšΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚Ρƒ Get-FileHash ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ»ΠΈ нСскольким Ρ„Π°ΠΉΠ»Π°ΠΌ.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

Microsoft. Powershell.Utility.FileHash

Get-FileHash Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вычислСнный Ρ…ΡΡˆ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для вычислСния Ρ…Π΅ΡˆΠ°.

  • Бписок Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²

ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ связь

ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΡ‚Π·Ρ‹Π² для

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π­Ρ‚Π° страница

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС ΠΎΡ‚Π·Ρ‹Π²Ρ‹ ΠΎ страницС

Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ† β€” Cprogramming.com

Π­Ρ€ΠΈΠΊ Π‘Ρƒ

Π₯эш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ эффСктивной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… массива с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, структура, ΠΈΠ½ΠΎΠ³Π΄Π° извСстная ΠΊΠ°ΠΊ ассоциативный массив ΠΈΠ»ΠΈ ΠΊΠ°Ρ€Ρ‚Π°. Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² C++ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ ΠΊΠ°Ρ€Ρ‚Ρ‹ STL для массивов с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… с использованиСм Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π², Π½ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ вас с Ρ‚Π΅ΠΎΡ€ΠΈΠ΅ΠΉ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠœΠ°ΡΡΠΈΠ²Ρ‹ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ массивы с индСксами

Одним ΠΈΠ· самых Π±ΠΎΠ»ΡŒΡˆΠΈΡ… нСдостатков Ρ‚Π°ΠΊΠΎΠ³ΠΎ языка, ΠΊΠ°ΠΊ C, являСтся отсутствиС массивы с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ массивС C (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ индСксированным массивом) СдинствСнный способ для доступа ΠΊ элСмСнту Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ порядковый Π½ΠΎΠΌΠ΅Ρ€. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ элСмСнт 50 ΠΈΠ· массив с ΠΈΠΌΠ΅Π½Π΅ΠΌ «сотрудники», Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

сотрудники[50];
 

Однако Π² массивС с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт с Β«ΠΊΠ»ΡŽΡ‡ΠΎΠΌΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ, ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ массив записСй сотрудников с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ записи сотрудника Β«Π”ΠΆΠΎΠ½ Π‘Ρ€Π°ΡƒΠ½Β» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

.
сотрудники["Π‘Ρ€Π°ΡƒΠ½, Π”ΠΆΠΎΠ½"];
 

Одна ΠΈΠ· основных Ρ„ΠΎΡ€ΠΌ массива с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ называСтся Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ. Π’ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠ»ΡŽΡ‡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для поиска элСмСнта вмСсто Π½ΠΎΠΌΠ΅Ρ€Π° индСкса. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с использованиСм индСксированного массива, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ способ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π² порядковый Π½ΠΎΠΌΠ΅Ρ€. Π­Ρ‚ΠΎΡ‚ способ называСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

Π₯Сш-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π₯Сш-функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π΅ΠΌ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Как устроСна Ρ…Π΅Ρˆ-функция Π½Π° самом Π΄Π΅Π»Π΅ кодируСтся Π² зависимости ΠΎΡ‚ ситуации, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ…Π΅Ρˆ-функция Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° основС ΠΊΠ»ΡŽΡ‡Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ‚Π°Π±Π»ΠΈΡ†Π° построСна Π½Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ваТная Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½ΠΎΠ³Π΄Π° ΡƒΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΈΠ· Π²ΠΈΠ΄Ρƒ. Ρ‡Ρ‚ΠΎ Ρ…ΡΡˆ-функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π΅ΠΉ даСтся Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡.

Допустим, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ список ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΈΠ· 200 адрСсов ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ людСй. Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ. Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° Π±Ρ‹Π»Π° Π±Ρ‹ идСальной для Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π²Π΅Ρ‰Π΅ΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ записям с фамилиями людСй Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ массива. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ массивом ΠΈΠ· 260 элСмСнтов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π² срСднСм ΠΎΠΊΠΎΠ»ΠΎ 10 ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² элСмСнтов.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим связь ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ ΠΈ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ:

А --> 0
Π‘ --> 1
Π‘ --> 2
Π” --> 3
...
ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ Π΄ΠΎ Z --> 25. 

Π‘Π°ΠΌΡ‹ΠΉ простой способ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π½Π° основС ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас 260 элСмСнтов, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ Π½Π° 10. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° даСтся Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ»ΡŽΡ‡, ΠΊΠ°ΠΊ Β«Π‘ΠΌΠΈΡ‚Β», ΠΊΠ»ΡŽΡ‡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² индСкс 180 (S β€” это 19-я Π±ΡƒΠΊΠ²Π° ΠΈΠΌΠ΅Π½ΠΈ). Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, поэтому S --> 18 ΠΈ 18 * 10 = 180).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для быстрого создания индСксного Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ индСксный Π½ΠΎΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для прямого доступа ΠΊ элСмСнту, врСмя доступа ΠΊ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ довольно ΠΌΠ°Π»ΠΎ. Бвязанный список ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ элСмСнтов Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ быстрым, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ придСтся ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡-элСмСнт.

БтолкновСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° столкновСний

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, «ВСбстСр» ΠΈ Β«Π£ΠΈΡ‚Π½ΠΈΒ» Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ порядковому Π½ΠΎΠΌΠ΅Ρ€Ρƒ, 22. Подобная ситуация, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΊΠ»ΡŽΡ‡Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мСсто Π² массивС, называСтся ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠ΅ΠΉ. Если Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнт, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ пространство ΡƒΠΆΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ элСмСнтом.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ массив ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° это Π»ΠΈΡˆΠ°Π΅Ρ‚ смысла использованиС Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Одним ΠΈΠ· прСимущСств Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° быстрая ΠΈ малСнькая.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсациСй

Π‘Π°ΠΌΡ‹ΠΉ простой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ извСстСн ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсации ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Когда Π²Ρ‹ добавляСтС элСмСнт, скаТСм Β«WhitneyΒ», ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ элСмСнт ΡƒΠΆΠ΅ сущСствуСт (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «ВСбстСр»), Π²Ρ‹ просто ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ пространству элСмСнтов (Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ послС «ВСбстСра»). Если ΠΎΠ½ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½, Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ пустоС мСсто для вставки Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта (Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², всС эти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ!)

...
220 Β«Π‘Π΅Π»Ρ‹ΠΉΒ» | <-- ### Π‘Π’ΠžΠ›ΠšΠΠžΠ’Π•ΠΠ˜Π• ### : НуТно ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ.
221 «ВСбстСр» | <-- ### COLLISION ### : Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ.
222 | Аааа, идСально. Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сюда.
223 |
...
 

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ вставки, Π½Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ элСмСнт. Π£ вас Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ нашли ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½, Π° Π½Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ элСмСнт. Π‘Π°ΠΌΡ‹ΠΉ простой способ β€” просто ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ. (Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ этой записи послСднСС имя "Whitney"? Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ этой?) Если элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ нашли, Π½Π΅ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½ΠΈΡ…, просто ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту, ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅Ρ‚Π΅ Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ пустоС мСсто (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнта Π½Π΅Ρ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅).

Π—Π²ΡƒΡ‡ΠΈΡ‚ просто, ΠΏΡ€Π°Π²Π΄Π°? Ну, это становится Π±ΠΎΠ»Π΅Π΅ слоТным. Π§Ρ‚ΠΎ, Ссли Ρƒ вас Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ столкновСний, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ±Π΅Π³Π°Π΅Ρ‚Π΅ Π·Π° ΠΊΠΎΠ½Π΅Ρ† массива?

Если Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ "Π—ΠΎΡ€Π±Ρƒ" ΠΈ всС элСмСнты Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΈΠ·-Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π°? ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

...
258 Β«Π£ΠΈΡ‚Π½ΠΈΒ» | <-- НСт, Π½Π΅ пусто
259 Β«Π—Π΅Π½ΠΎΒ» | НСт, Π½Π΅ пустой
---------------- <-- Π­ΠΌΠΌΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ?
 

ΠŸΡ€ΠΎΡ‰Π΅ всСго просто снова Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ. Если пустых мСст ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅Ρ‚, Ρ‚ΠΎ приходится ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π°ΠΌ нСдостаточно мСста Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ для всСх элСмСнтов. Если ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ массив, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π°ΠΌ придСтся ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ настройку нашСй Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΊΠ°ΠΊ ΠΌΡ‹ с этим справляСмся), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π» ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ снова, Π½ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ мСсто. (ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° вставка значСния Π² список ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΊΠΎΠΏΠΈΠΈ O (n) опСрация Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒΡΡ, Π½ΠΎ Π² срСднСм это Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄Ρ‹Ρ… n вставлСнных элСмСнтов, поэтому вставка Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π² срСднСм постоянноС врСмя, O (1). (Если Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹, ΠΊΠ°ΠΊ "O(n") ΠΈ "постоянноС врСмя" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, взглянитС Π½Π° БСрия статСй Cprogramming.com ΠΎΠ± алгоритмичСской эффСктивности.) Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ ΠΏΠ»ΠΎΡ…ΠΎ β€” Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, сколько мСста Π²Π°ΠΌ потрСбуСтся для Π½Π°Ρ‡Π°Π»Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΎΠΉ

Вторая стратСгия ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² сохранСнии связанного списка Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС Ρ…Π΅Ρˆ-структуры Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² связанный список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ хранится Π² Ρ…ΡΡˆ-индСксС. Если Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ список ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта β€” Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ элСмСнтов, Ρ…Π΅ΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ большС, Ρ‡Π΅ΠΌ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈ Ρ…Π΅Ρˆ-коллизиях.

Одна приятная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ связывания состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ "рядом" Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсации, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ кластСр Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρƒ вас закончится свободноС пространство Π² этой части Ρ…ΡΡˆΠ°. ΠŸΡ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты.

ДинамичСскоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² зависимости ΠΎΡ‚ коэффициСнта Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π²Ρ‹ Π±Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваша Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ заполнялась, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это сдСлаСт поиск Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ дольшС. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ находится Π² массивС, с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсациСй Π²Π°ΠΌ придСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ поиск, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ Π½Π°Ρ‚ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ Π½Π° пустоС мСсто ΠΈΠ»ΠΈ Π½Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚Π΅ΡΡŒ ΠΊ исходной Ρ‚ΠΎΡ‡ΠΊΠ΅ β€” Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, с ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ поиск ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ O( ΠΏ.), Ρ‡Ρ‚ΠΎ уТасно. РСальная рСализация Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ коэффициСнт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ элСмСнтов ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ массива. Если Ρƒ вас Π΅ΡΡ‚ΡŒ массив ΠΈΠ· 10 элСмСнтов с 7 элСмСнтами, коэффициСнт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ€Π°Π²Π΅Π½ 0,7. На самом Π΄Π΅Π»Π΅, 0.7, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, являСтся подходящим Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ массива.

Π’Ρ‹Π±ΠΎΡ€ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ

Π§Π΅ΠΌ большС Ρƒ вас ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ, Ρ‚Π΅ΠΌ Ρ…ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вашСй Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚. ИмСя достаточноС количСство элСмСнтов Π² вашСй Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ срСднСС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, которая довольно Ρ…ΠΎΡ€ΠΎΡˆΠ° - ΠΏΠΎ сущСству, постоянноС врСмя O (1). (Ѐокус Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΡŒΡ‚Π΅ массив расти со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ массив.) Но Ссли Π²Ρ‹ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΡΡˆΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎΠ³Π΄Π° Π²Π°ΠΌ придСтся Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ поиска ΠΏΠΎ списку элСмСнтов, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ваш поиск Ρ…ΡΡˆΠ° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΎΡ‚ постоянного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌΡƒ. врСмя ΠΏΠΎ количСству элСмСнтов. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ссли Π±Ρ‹ ваша Ρ…ΡΡˆ-функция Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π»Π° всС значСния Π½Π° 0, помСщая ΠΈΡ… Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива. Π’ΠΎΠ³Π΄Π° это Π±ΡƒΠ΄Π΅Ρ‚ просто Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТный способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ поиска.

Π’Ρ‹Π±ΠΎΡ€ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ остороТности ΠΈ экспСримСнтов. ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ вашСго ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°. Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Π²Ρ‹, вСроятно, Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто смотрит Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±ΡƒΠΊΠ²Ρ‹ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ - Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с S, Ρ‡Π΅ΠΌ с Z. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваши Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ быстро - Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‚Π΅Ρ€ΡΡ‚ΡŒ всю экономию Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΡ‚ Ρ…ΡΡˆΠ° table, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ вычисляСтС Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. это Π΄Π΅Π»ΠΈΠΊΠ°Ρ‚Π½Ρ‹ΠΉ остаток срСдств. Для ΠΎΠ΄Π½ΠΎΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ этот Ρ…Π΅Ρˆ-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свою ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅. это Π½Π΅ слишком слоТно, Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вСсьма ΠΏΠΎΠ»Π΅Π·Π΅Π½.

Π‘Ρ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

БвязанныС списки

ΠšΠ°Ρ€Ρ‚Π° STL, связанный массив

Zero Hash ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Π΅Ρ‚ 35 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… сСрии C, возглавляСмой

Zero Hash ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Π΅Ρ‚ срСдства ΠΎΡ‚ Point72 Ventures Π‘Ρ‚ΠΈΠ²Π΅Π½Π° Коэна, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ NYCA Partners, DriveWealth ΠΈ Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… бизнСс-Π°Π½Π³Π΅Π»ΠΎΠ² FinTech

| Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: НулСвой Ρ…ΡΡˆ НулСвой Ρ…ΡΡˆ


Π§Π˜ΠšΠΠ“Πž, 30 сСнтября 2021 Π³. (GLOBE NEWSWIRE) β€” Zero Hash, вСдущая компания, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰Π°ΡΡΡ инфраструктурой Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… Π°ΠΊΡ‚ΠΈΠ²ΠΎΠ², которая прСдоставляСт Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ, ΠΏΡ€ΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, Π·Π°Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π²ΠΎΠ·Π½Π°Π³Ρ€Π°ΠΆΠ΄Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Ρ‹, сСгодня объявила ΠΎ 35 Π΄ΠΎΠ»Π»Π°Ρ€Π°Ρ… БША. ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π² Π½ΠΎΠ²ΠΎΠΌ финансировании сСрии C. Π˜Π½Π²Π΅ΡΡ‚ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π°ΡƒΠ½Π΄ Π²ΠΎΠ·Π³Π»Π°Π²ΠΈΠ» Point72 Ventures вмСстС с NYCA Partners, DriveWealth ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ. Π’ Ρ€Π°ΡƒΠ½Π΄Π΅ Ρ‚Π°ΠΊΠΆΠ΅ приняли участиС нСсколько извСстных бизнСс-Π°Π½Π³Π΅Π»ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС Иммад Ахунд (ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ Mercury), КалпСш Кападиа (ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ Deserve), Π˜Ρ‚Π°Π½ Π‘Π»ΠΎΡ… (Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Digit) ΠΈ ДТСйсон Π“Π°Ρ€Π΄Π½Π΅Ρ€ (ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ Marqeta). .

Β«Zero Hash опрСдСляСт ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΈΠ½Ρ‚Π΅Ρ…-Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒ Β«Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠ°ΠΊ услуга». Zero Hash β€” это полноцСнная встроСнная инфраструктурная ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° B2B, которая позволяСт любой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ быстро ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Ρ‹ Π² собствСнный клиСнтский ΠΎΠΏΡ‹Ρ‚Β», β€” сказал Π­Π΄Π²Π°Ρ€Π΄ Π’ΡƒΠ΄Ρ„ΠΎΡ€Π΄, ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€. Β«ΠœΡ‹ обСспСчиваСм Ρ‚ΠΎΡ€Π³ΠΎΠ²Π»ΡŽ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ ΠΈ ΠΈΡ… Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎΠ·Π½Π°Π³Ρ€Π°ΠΆΠ΄Π΅Π½ΠΈΠΉ с ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚ΠΎΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΡ…ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ Π·Π° счСт ставок ΠΈ DeFi. Zero Hash Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя всю Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для прСдлоТСния ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² с Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈΒ».

Zero Hash Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΊΡ€ΡƒΠΏΠ½Π΅ΠΉΡˆΠΈΡ… Π½Π΅ΠΎΠ±Π°Π½ΠΊΠΎΠ² (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ MoneyLion ΠΈ Wirex) ΠΈ извСстных Π±Ρ€ΠΎΠΊΠ΅Ρ€ΠΎΠ²-Π΄ΠΈΠ»Π΅Ρ€ΠΎΠ² (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ deliciousworks ΠΈ TradeStation). Zero Hash Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΠ· ΠΊΡ€ΡƒΠΏΠ½Π΅ΠΉΡˆΠΈΡ… Π±Ρ€Π΅Π½Π΄ΠΎΠ² Π² экосистСмС финансовых Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ финансовых услуг, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ криптопрСдлоТСния.

Компания ΠΏΠΎΡ‡Ρ‚ΠΈ ΡƒΠ΄Π²ΠΎΠΈΠ»Π° количСство сотрудников с Π½Π°Ρ‡Π°Π»Π° 2021 Π³ΠΎΠ΄Π°, Π° Π½Π΅Π΄Π°Π²Π½ΠΎ достигла ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. НулСвой Ρ…Π΅Ρˆ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡ‚ всСго объСма ΠΎΠ½Ρ‡Π΅ΠΉΠ½-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² ΠΌΠΈΡ€Π΅. Компания Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΡƒ ΠΎΡ‚ Ρ€Π°ΡƒΠ½Π΄Π° для дальнСйшСго Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ прСдлоТСния своих ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС Π² пространствС DeFi ΠΈ NFT. Π’Π»ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΏΠΈΡ‚Π°Π»Π° Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² подраздСлСниях ΠΏΠΎ соблюдСнию Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³Ρƒ, ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌ ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΈ. Компания Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π° Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ свою Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ систСму лицСнзирования, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ стратСгичСскиС приобрСтСния.

Β«Zero Hash Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ, которая ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΈΠ½Ρ‚Π΅Ρ…- ΠΈ финансовым учрСТдСниям бСспрСпятствСнно Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ криптографичСскиС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ ΠΈ ΠΎΠΏΡ‹Ρ‚ Π² свои прилоТСния Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ совмСстимым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌΒ», β€” сказал Адам ΠšΠ°Ρ€ΡΠΎΠ½, ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€ Point72 Ventures. Β«ΠœΡ‹ считаСм, Ρ‡Ρ‚ΠΎ встроСнныС финансовыС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Crypto API Zero Hash, ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² обСспСчСнии Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ внСдрСния Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… Π°ΠΊΡ‚ΠΈΠ²ΠΎΠ², позволяя потрСбитСлям ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Π΅ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΠΈΠ½Ρ‚Π΅Ρ…-прилоТСния ΠΈ Π±Ρ€Π΅Π½Π΄Ρ‹ финансовых услуг, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π΄ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚Β».

О Zero Hash:

Миссия Zero Hash – Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ возмоТности Π½ΠΎΠ²Π°Ρ‚ΠΎΡ€ΠΎΠ², прСдоставляя доступ ΠΊ финансовой систСмС 2.0. Zero Hash прСдоставляСт комплСксноС Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ Π²Π»Π°Π΄Π΅Ρ‚ΡŒ клиСнтским ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π½ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈ нСбольшого тСхничСского подъСма (вопрос ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ API). Zero Hash позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ компаниям ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° создании ΠΎΠΏΡ‹Ρ‚Π° ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ². Π’ число ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Zero Hash входят Π½Π΅ΠΎΠ±Π°Π½ΠΊΠΈ, брокСрско-дилСрскиС ΠΈ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹.

Zero Hash Holdings Ltd. β€” компания C-Corp ΡˆΡ‚Π°Ρ‚Π° ДСлавэр, которая ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Zero Hash LLC ΠΈ Zero Hash Liquidity Services LLC.

Zero Hash LLC, дочСрняя компания Zero Hash Holdings Ltd., являСтся зарСгистрированной Π² FinCen ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ ΠΏΠΎ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΡŽ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… срСдств, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρƒ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… срСдств, которая ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² 51 ΡŽΡ€ΠΈΡΠ΄ΠΈΠΊΡ†ΠΈΠΈ БША. Zero Hash Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡŽ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Π°Π»ΡŽΡ‚Ρƒ ΠΎΡ‚ NYDFS. Π’ КанадС Zero Hash LLC зарСгистрирована Π² FINTRAC ΠΊΠ°ΠΊ компания, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Π΅ услуги.

О Point72 Ventures:

Point72 Ventures – это глобальная стратСгия Π²Π΅Π½Ρ‡ΡƒΡ€Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΏΠΈΡ‚Π°Π»Π°, возглавляСмая Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ экспСртами Π² Π΄Π°Π½Π½ΠΎΠΉ области, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ достаточным ΠΊΠ°ΠΏΠΈΡ‚Π°Π»ΠΎΠΌ ΠΈ полномочиями для провСдСния Ρ€Π°ΡƒΠ½Π΄ΠΎΠ² Π½Π° всСх этапах роста ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΠΎΡ‚ ΠΈΠ΄Π΅ΠΈ Π΄ΠΎ IPO. Команда инвСстируСт Π² основатСлСй со смСлыми идСями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ новСйшиС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ для провСдСния трансформационных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π°Π·Π½Ρ‹Ρ… отраслях. Point72 Ventures ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ прСдприниматСлям доступ ΠΊ ΠΎΠΏΡ‹Ρ‚Ρƒ ΠΈ идСям, ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ тСхничСским Ρ‚Π°Π»Π°Π½Ρ‚Π°ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ. Point72 Ventures с офисами Π² БША ΠΈ Π•Π²Ρ€ΠΎΠΏΠ΅ являСтся Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Point72, глобальной ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, основанной Π‘Ρ‚ΠΈΠ²Π΅Π½ΠΎΠΌ А. Коэном. Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ посСтитС  p72.vc .

ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹ прСссы:

Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ…ΡΡˆ
Π­Π΄Π²Π°Ρ€Π΄ Π’ΡƒΠ΄Ρ„ΠΎΡ€Π΄
(855) 744-7333 Ext: 102
[email protected]

. -2052
[email protected]



ΠœΠ΅Ρ‚ΠΊΠΈ

Π’ΠΎΡ‡ΠΊΠ°72 NYCA DriveWealth Π²Π΅Π½Ρ‡ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠ°ΠΏΠΈΡ‚Π°Π» Ρ€Ρ‹Π½ΠΎΠΊ

РСализация быстрого Ρ…Π΅ΡˆΠ° MD5 Π² сборкС x86

Π Π°Π΄ΠΈ экспСримСнта я Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, насколько я ΠΌΠΎΠ³Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ x86 MD5 для увСличСния скорости. Π― Π½Π°Ρ‡Π°Π» с довольно простой Π½Π°ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π·Π°Ρ‚Π΅ΠΌ пСрСупорядочил инструкции ΠΈ сдСлал эквивалСнтныС логичСскиС прСобразования. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ Ρ‚Ρ€ΡŽΠΊ с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ добавлял нСсколько ΠœΠ‘/с скорости, Π½ΠΎ послС ΠΏΠΎΡ‡Ρ‚ΠΈ сотни ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ (ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΊΠΎΠ»ΠΎ 20 Π±Ρ‹Π»ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌΠΈ) ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±Ρ‹Π» ΠΎΡˆΠ΅Π»ΠΎΠΌΠ»ΡΡŽΡ‰ΠΈΠΌ 59.% увСличСния скорости.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Код состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… частСй:

  • Π’Ρ€ΠΈ взаимозамСняСмыС вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сТатия MD5:

    • Π’ сборкС x86, Π½Π°ΠΈΠ²Π½ΠΎ (md5-naive-x86.S).
    • Π’ сборкС x86, послС ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (md5-fast-x86.S).
    • Π’ C, для сравнСния с вСрсиСй x86 (md5.c).
  • Полная Ρ…Π΅Ρˆ-функция MD5 (Π½Π° C), которая ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ хвоста. Π­Ρ‚ΠΎ Π½Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ЦП, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² настройкС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ сТатия.

  • ЗапускаСмая основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая провСряСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ выполняСт тСст скорости.

Π€Π°ΠΉΠ»ΠΎΠ²:

  • md5-test.c
  • md5.c
  • md5-Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ-x86.S
  • md5-быстро-x86.S
  • md5-быстро-x8664.S

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄, скомпилируйтС Π΅Π³ΠΎ Π² Linux с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄:

  • ΠΊΡƒΠ±.см md5-test.c md5.c -o md5-test (x86, x86-64)
  • cc md5-test.c md5-naive-x86.S -o md5-test (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ x86)
  • cc md5-test.c md5-fast-x86.S -o md5-test (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ x86)
  • cc md5-test.c md5-fast-x8664.S -o md5-test (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ x86-64)

Π—Π°Ρ‚Π΅ΠΌ запуститС исполняСмый Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ./md5-test .

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстов

Код Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π° x86 Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π° x86-64
C GCC -O0 122Β MiB/s 123Β MiB/s
C GCC -O1 379Β MiB/s 390Β MiB/s
C GCC -O2 387Β MiB/s 389Β MiB/s
C GCC -O3 387Β MiB/s 389Β MiB/s
C GCC -O1 -fomit-frame-pointer 382Β MiB/s
C GCC -O2 -fomit-frame-pointer 389Β MiB/s
C GCC - O3 -fomit-frame-pointer 390Β MiB/s
Assembly (naive) GCC -O0 270Β MiB/s
Assembly (fast) GCC -O1 430Β ΠœΠΈΠ‘/с
Assembly (fast) GCC -O2 427Β MiB/s
Assembly (OpenSSL [0] ) GCC -O0 410Β MiB/s

На ΠΎΠ±Π΅ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ… процСссора ΠΌΠΎΠΉ ассСмблСрный ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 1,10 Ρ€Π°Π·Π° быстрСС, Ρ‡Π΅ΠΌ ΠΌΠΎΠΉ ΠΊΠΎΠ΄ C, Π»ΡƒΡ‡ΡˆΠ΅ всСго скомпилированный GCC. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ΄ C ΠΈ ассСмблСрный ΠΊΠΎΠ΄, скомпилированныС с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ опциями, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π° ΠΎΠ±Π΅ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ….

ВсС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстов основаны Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ЦП = Intel Core 2 Quad Q6600 2,40Β Π“Π“Ρ† (ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ), ОБ = Ubuntu 10.04 (32-разрядная ΠΈ 64-разрядная), компилятор = GCC 4.4.3.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

  • Мой ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΡƒΠΆΠ΅ Π±Ρ‹Π» Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ цикличСски. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ΅ΠΉ Ρ†Π΅Π»ΡŒΡŽ Π±Ρ‹Π»Π° оптимизация ΠΏΠΎ скорости, Π±Ρ‹Π»ΠΎ Π±Ρ‹ бСссмыслСнно Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, которая ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ связана с Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ расходами Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ.

  • Π― Π±Ρ‹Π» ΡƒΠ΄ΠΈΠ²Π»Π΅Π½, ΡƒΠ²ΠΈΠ΄Π΅Π², Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΉ Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ x86 Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΊΠΎΠ΄, сгСнСрированный GCC, ΠΈ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΉ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠΎΠ΄ Π±Ρ‹Π» Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΊΠΎΠ΄ GCC.

  • Иногда Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструкций ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ большС арифмСтичСских вычислСний ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π±ΠΎΠ»Π΅Π΅ быстрому ΠΊΠΎΠ΄Ρƒ. Π― Π΄ΡƒΠΌΠ°ΡŽ, это сработало, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я сдСлал Π³Ρ€Π°Ρ„ΠΈΠΊ зависимости Π΄Π°Π½Π½Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠΌ ΠΈ воспользовался прСимущСствами супСрскалярного процСссора.

  • ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² инструкций, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ… нСзависимыС вычислСния, использованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов ΠΈΡ… чСрСдования ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ супСрскалярного процСссора.

  • Π—Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ инструкциСй LEA для добавлСния Π΄Π²ΡƒΡ… рСгистров ΠΈ константы β€” классичСский ΠΏΡ€ΠΈΠ΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ с прСдсказуСмым ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ.

  • Π£ мСня Π±Ρ‹Π»ΠΎ достаточно рСгистров для хранСния всСх ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (4 для состояния MD5, 2 для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… вычислСний Π·Π° Ρ€Π°ΡƒΠ½Π΄, 1 для основания массива Π±Π»ΠΎΠΊΠΎΠ² ΠΈ 1 для стСка), Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ сдСлало ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΠΎΡ‡Π΅ ΠΈ БыстрСС. Однако я Π½Π΅ использовал рСгистр EBP ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом.

  • ОбС ΠΌΠΎΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MD5 для x86 ΠΈ C ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ макросы прСпроцСссора C для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π°.

  • Код x86-64: ВсС Ρ„Π°ΠΉΠ»Ρ‹ C Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π° x86-64. Π― внСс ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния Π² ассСмблСрный ΠΊΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊ соглашСнию ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ 32-Π±ΠΈΡ‚Π½Ρ‹Π΅ константы числами со Π·Π½Π°ΠΊΠΎΠΌ.