Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien by halloworld

View this thread on steempeak.com
· @halloworld · (edited)
$0.16
Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien
# Was MD5 im Webserver leisten kann

 <center>
<br>
![DQmPiKcYtB7kqiL7JBjL6JuybPbUPxNvxTAkFarMCAP5xZK_1680x8400.jpeg](https://steemitimages.com/DQmUq4Q2fGmX1eNirYvuqxfwwmkX8oQG4s5FQympmnXnHq5/DQmPiKcYtB7kqiL7JBjL6JuybPbUPxNvxTAkFarMCAP5xZK_1680x8400.jpeg)
<br>
</center>

### Wir organisieren Verzeichnisnamen für große Dateimengen!<br>
#### ( .. Millionen Dateien  )


Ich werde hier die Vorzüge und Nachteile der Funktion MD5 in PHP aufzeigen. Ich nehme dabei das Organisieren einer Verzeichnisstrukrur als Anwendungsbeispiel.

## Legen wir los:
Mal angenommen, sie haben extrem viele Dateien auf einem Webserver zu organisieren. Sie wollen eine möglichst gute Verteilung der Dateien auf alle Verzeichnisse und keine tiefe Verschachtelungsebenen in den Dateibaum.

## Die Lösung: MD5-basierte Verzeichnisse!

# Was ist MD5?

MD5 ist eine Hashfunktion. Diese Funktion erzeugt aus einer beliebigen Bitfolge von Daten, eine feste Bitfolge von Daten .z.b. **d05496d9c319aeaf84589882e892faf2**. Diese Folge lässt sich nicht mehr rückwärts berechnen. Also aus einem Hash kann man die Ursprüngliche Information nicht mehr ausrechnen, da zu einer endlichen Folge, unendlich viele Daten passen können. Wir werden aber andere Aspekte beleuchten und nutzen.

Eine Hashfunktion wie MD5 hat bestimmte Eigenschaften, die wir bei unserer Anforderung nutzen können. Diese Eigenschaften sind folgende:

** Vorteilhaft:**

* eine statistische Gleichverteilung der Ziffernfolge ( Hexadezimal 0 - f )
* große Änderungen bei Hashwerten, trotz kleiner Änderung der Eingabedaten ( z.b. Dateien )

** Nachteile: **

* Rechenzeit, Hashs müssen erst errechnet werden
* Kollisionswahrscheinlichkeit, also gleiche Hash-Werte bei unterschiedlichen Daten, hat aber für uns praktisch keine Nachteile
<br><br>
### Wir wollen hier die Vorzüge nutzen!

# Vorgehen

Mit PHP errechnen wir über die Standard-Funktion md5_file() unseren Hashwert. Aus den jeweils ersten zwei Ziffern erzeugen wir den Namen für ein Verzeichnis. Ist das Verzeichnis vorhanden, so wird die Datei darin abgelegt, welche aus dem Ziffernblock hervorgeht, ist es nicht vorhanden wird es neu angelegt und erst dann die Datei darin abgelegt.

Da es bei zwei Ziffernfolgen von 00 bis ff als Verzeichnisnamen geben kann, erhalten wir 16^2 also 256 Variationen für mögliche Verzeichnisnamen.

Wenn wir ca. 1 Millionen Dateien haben, verteilen im Schnitt sich je 3906 1/4 Dateien pro Ordner. Schon in der 2. Verzeichnisebene kann man mit dem gleichen Prinzip aus der Position 3 und 4 des Hashwertes die Unterordner aufbauen. Nochmal 256 entspricht im Mittel 15 -16 Dateien.

<br><br>
# Resumee

Dadurch erhält man bei nur 2 Verzeichnisebenen eine recht überschaubare Verteilung. Wenn man den Hash auch in einer Datenbank speichert, kann man hierdurch eine Datei schnell im richtigen Ordner finden. Es ist auch leicht zu prüfen, ob man eine Datei bereits gespeichert hat, denn hier ist es ebenso rasend schnell möglich, den richtigen Ordner anzuspringen. Im zweiten Schritt muss man dann nur noch die wenigen Dateien durchgehen, die im einzelnen Ordner liegen. 
<br>
Selbst bei 1 Millarde Dateien, reicht eine weitere Ebene aus, um aus diesem Prinzip Ordner zu  erstellen. Wir wären dann knapp unter 60 Dateien im Mittel pro Verzeichnis.
<br>
Das könnte dann z.B. so aussehen : ** / df / 3a / 33 / halloworld.jpg **
<br>
Das ist, troz der Masse von einer Milliarde, noch recht übersichtlich. Kollisionen machen in diesem Anwendungszenario keine Probleme, da selbst bei gleichen Hashs nur die 1. 6 Ziffern benutzt werden, um die Ordner zu erstellen und wir wollen ja die Dateien relativ gleich aufteilen.

Die maximale Ordnerzahl lässt sich ebenso leicht errechnen. Pro Tiefe mit je 2 Ziffern ergibt sich die Regel wie folgt:
<br>
### Beispiel für 1 Milliarde Dateien
<br>
**d0 54 96 ** d9c319aeaf84589882e892faf2

| **Verzeichnis-Struktur** | max. Ordnerzal pro Ebene | absolute Ordnerzahl | Dateien pro Ordner           |
| ------------------------ | ------------------------ | ------------------: | :--------------------------- |
| / d                      | / 16                     |                  16 | 62,5 Millionen *theroretisch |
| / d0                     | / 256                    |                 256 | ca. 3,9 Millionen            |
| / d / 0                  | / 16 / 16                |                 256 | -- --                        |
| / d0 / 54                | / 256 / 256              |               65536 | ca. 15 260                   |
| / d0 / 54 / 96           | / 256 / 256 / 256        | rund 16,8 Millionen | ca. 60                       |

<br>

### Beispiel für 1 Millionen Dateien
<br>
**d0 54 96 ** d9c319aeaf84589882e892faf2

| **Verzeichnis-Struktur** | max. Ordnerzal pro Ebene | absolute Ordnerzahl | Dateien pro Ordner |
| ------------------------ | ------------------------ | ------------------: | :----------------- |
| / d                      | / 16                     |                  16 | 62 500             |
| / d0                     | / 256                    |                 256 | ca. 3900           |
| / d / 05                 | / 16 / 256               |                 4096 | ca. 245            |
| / d0 / 94                | / 256 / 256              |               65536 | ca. 15 - 16        |

Alle Werte sind natürlich immer Mittlwerte. Starke Abweichungen sind möglich aber halten sich in Grenzen.


<br><br>
# Implementierung in PHP

Ich gehe hier auf die Kernfunktion für eine Variante ein. Selbstverständlich ist dieses Prinzip noch ausbaubar und man kann auch eine ganze Klasse daraus erstellen, welche uns die Dateien anlegt.

![Bildschirmfoto 2018-08-14 um 22.55.55.png](https://cdn.steemitimages.com/DQmTWeLSxut3hA1rc7hiEDrKSLQHYWxVwyxEbra4dYXDDnv/Bildschirmfoto%202018-08-14%20um%2022.55.55.png)

<br><br>

``` 
function get_dir_md5( $file_ressource , $pos ){
    $md5_string = md5_file( $file_ressource );
    # $md5_string = "d05496d9c319aeaf84589882e892faf2"; # test
    $parts = str_split( $md5_string , 2 );
    return
        $parts[ $pos ];
}

$file = '/var/www/html/data/files/halloworld.jpg';

print_r(
    get_dir_md5( $file , 0 ) . DIRECTORY_SEPARATOR . get_dir_md5( $file , 1 )
); 
```
<br><br><br>

Weiterführende Quellen:

* https://de.wikipedia.org/wiki/Message-Digest_Algorithm_5
* https://de.wikipedia.org/wiki/Hashfunktion
* http://php.net


<br><br>

<center>
<br>

#webdevelopment #code #coding #dev #development #programming #codedesign #codereview #cleancode #steemit #steem #stem #de-stem #steemstem #busy #utopian-io #technology #science #sql #md5 #hash #hashes #crypto #deutsch #deutschland #german #germany #orginal #diy #php #webserver #files #dir #directory 

<br>

<a href="https://busy.org/i/@halloworld">
![rect4138.png](https://steemitimages.com/DQmURKrKGzJoojPJsCnKUF8iDZdafGDsvzjE94rpmsTXTJR/rect4138.png)
</a>
</center>
👍  , , , , , , , , , , , , , ,
👎  , ,
properties (23)
post_id59,713,875
authorhalloworld
permlinkvorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien
categoryutopian-io
json_metadata{"links":["https:\/\/de.wikipedia.org\/wiki\/Message-Digest_Algorithm_5","https:\/\/de.wikipedia.org\/wiki\/Hashfunktion","http:\/\/php.net","https:\/\/busy.org\/i\/@halloworld"],"format":"markdown","app":"steemit\/0.1","image":["https:\/\/steemitimages.com\/DQmUq4Q2fGmX1eNirYvuqxfwwmkX8oQG4s5FQympmnXnHq5\/DQmPiKcYtB7kqiL7JBjL6JuybPbUPxNvxTAkFarMCAP5xZK_1680x8400.jpeg"],"tags":["utopian-io","computer","technology","tutorial","php"]}
created2018-08-14 21:20:00
last_update2018-08-14 21:40:33
depth0
children6
net_rshares120,430,977,975
last_payout2018-08-21 21:20:00
cashout_time1969-12-31 23:59:59
total_payout_value0.152 SBD
curator_payout_value0.008 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length6,867
author_reputation549,540,873,857
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars0
author_curate_reward""
vote details (18)
@portugalcoin ·
$8.20
Thank you for your contribution.

- Only submissions in easily understood English will be reviewed and scored. Contributions in other languages must include a full and comprehensible translation of all content included in the submission.

<b>Please read the utopian guidelines <a href="https://join.utopian.io/guidelines/">here</a>.</b>

---- 
Need help? Write a ticket on https://support.utopian.io/. 
Chat with us on [Discord](https://discord.gg/uTyJkNm). 
[[utopian-moderator]](https://join.utopian.io/)
👍  , ,
properties (23)
post_id59,719,583
authorportugalcoin
permlinkre-halloworld-vorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien-20180814t224913638z
categoryutopian-io
json_metadata{"app":"steemit\/0.1","links":["https:\/\/join.utopian.io\/guidelines\/","https:\/\/support.utopian.io\/","https:\/\/discord.gg\/uTyJkNm","https:\/\/join.utopian.io\/"],"tags":["utopian-io"]}
created2018-08-14 22:49:12
last_update2018-08-14 22:49:12
depth1
children1
net_rshares6,094,329,793,692
last_payout2018-08-21 22:49:12
cashout_time1969-12-31 23:59:59
total_payout_value6.153 SBD
curator_payout_value2.049 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length506
author_reputation214,343,891,436,406
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (3)
@utopian-io ·
Thank you for your review, @portugalcoin!

So far this week you've reviewed 17 contributions. Keep up the good work!
properties (22)
post_id59,809,401
authorutopian-io
permlinkre-re-halloworld-vorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien-20180814t224913638z-20180815t210509z
categoryutopian-io
json_metadata{"app":"beem\/0.19.42"}
created2018-08-15 21:05:09
last_update2018-08-15 21:05:09
depth2
children0
net_rshares0
last_payout2018-08-22 21:05:09
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length116
author_reputation152,913,012,544,965
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@fr4mer ·
Guter Artikel und solides Verfahren, wenn man die maximale Anzahl der Dateien pro Ordner einschränken möchte. Unter anderem wird dieses Verfahren von MediaWiki für deren Dateiupload verwendet [[1]](https://www.mediawiki.org/wiki/Manual:$wgHashedUploadDirectory) , also nicht völlig fernab der Praxis.

Inzwischen aber leider nicht mehr so wichtig, da moderne Dateisysteme sehr viele Dateien pro Ordner erlauben.

[1] https://www.mediawiki.org/wiki/Manual:$wgHashedUploadDirectory
👍  
properties (23)
post_id59,754,378
authorfr4mer
permlinkre-halloworld-vorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien-20180815t075939034z
categoryutopian-io
json_metadata{"app":"steemit\/0.1","tags":["utopian-io"],"links":["https:\/\/www.mediawiki.org\/wiki\/Manual:$wgHashedUploadDirectory"]}
created2018-08-15 07:59:36
last_update2018-08-15 07:59:36
depth1
children1
net_rshares1,044,751,795
last_payout2018-08-22 07:59:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length479
author_reputation3,821,397,562
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (1)
@halloworld ·
$0.07
Danke für den ergänzenden Link.
👍  ,
properties (23)
post_id59,791,082
authorhalloworld
permlinkre-fr4mer-re-halloworld-vorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien-20180815t163956147z
categoryutopian-io
json_metadata{"tags":["utopian-io"],"app":"steemit\/0.1"}
created2018-08-15 16:39:57
last_update2018-08-15 16:39:57
depth2
children0
net_rshares49,461,400,150
last_payout2018-08-22 16:39:57
cashout_time1969-12-31 23:59:59
total_payout_value0.050 SBD
curator_payout_value0.015 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length31
author_reputation549,540,873,857
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars0
author_curate_reward""
vote details (2)
@super-grand-ad · (edited)
https://steemitimages.com/DQmaxbn2X4FYDfLB432oxmfAaDxsM6eY6CYqLsLKYxHEKes/SUPER-GRAND-AD%20LOGO.jpg?r=super-grand-ad

Hi @halloworld From @super-grand-ad 
Did You know you can get Free Re steems
From Me and 
https://steemit.com/trending/aaa-resteem
So you do not have to PAY for Re steems
I posted to you because I was down voted by the Bot
https://steemit.com/@einsundnull
And it Is linked to Steembot who you paid to get resteemed

Have a good day @super-grand-ad
👍  
👎  ,
properties (23)
post_id60,808,341
authorsuper-grand-ad
permlinkre-halloworld-vorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien-20180826t203532819z
categoryutopian-io
json_metadata{"users":["halloworld","super-grand-ad"],"links":["https:\/\/steemit.com\/trending\/aaa-resteem","https:\/\/steemit.com\/@einsundnull"],"image":["https:\/\/steemitimages.com\/DQmaxbn2X4FYDfLB432oxmfAaDxsM6eY6CYqLsLKYxHEKes\/SUPER-GRAND-AD%20LOGO.jpg?r=super-grand-ad"],"app":"steemit\/0.1","tags":["utopian-io"]}
created2018-08-26 20:35:33
last_update2018-08-26 20:39:15
depth1
children0
net_rshares-41,552,678,216
last_payout2018-09-02 20:35:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length465
author_reputation-195,984,724,254
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (3)
@gotonik ·
Danke für den Artikel. 
Genau so etwas habe ich für meine Bilderverwaltung gesucht. Die Idee finde ich recht interessant.
properties (22)
post_id68,079,471
authorgotonik
permlinkre-halloworld-vorzuege-vom-md5-hash-verzeichnisse-organisieren-mit-milliarden-von-dateien-20181229t195758581z
categoryutopian-io
json_metadata{"app":"steemit\/0.1","tags":["utopian-io"]}
created2018-12-29 19:57:57
last_update2018-12-29 19:57:57
depth1
children0
net_rshares0
last_payout2019-01-05 19:57:57
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length121
author_reputation0
root_title"Vorzüge vom MD5-Hash - Verzeichnisse Organisieren mit Milliarden von Dateien"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000