Majhne spremembe

This commit is contained in:
Martin Vuk 2026-01-14 11:59:44 +01:00
parent b6c83ca3e5
commit a23c2e32fe
8 changed files with 12 additions and 15 deletions

View file

@ -16,6 +16,5 @@
width: 2cm, fill: blue.lighten(50%), ..args) width: 2cm, fill: blue.lighten(50%), ..args)
#let file-object(coord, hash, name, ..args) = commit-object(coord, hash, name, #let file-object(coord, hash, name, ..args) = commit-object(coord, hash, name,
width: 2cm, fill: gray.lighten(50%), ..args) width: 2cm, fill: gray.lighten(50%), ..args)
#let git-object(hash, content) = table(columns: 1, [Zgoščena vrednost: #raw(hash)], raw(block:true, content))
#let bla(coord, ..args) = file-object(coord, "bcc138", ..args)[bla] #let bla(coord, ..args) = file-object(coord, "bcc138", ..args)[bla]
#let blabla(coord, ..args) = file-object(coord, "2ce22b", ..args)[blabla] #let blabla(coord, ..args) = file-object(coord, "2ce22b", ..args)[blabla]

View file

@ -1,6 +1,6 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill #import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object #import "../definicije.typ": file-object, tree-object, commit-object
#diagram(node-stroke: 0.5pt, #diagram(node-stroke: 0.5pt,
{ {

View file

@ -1,6 +1,6 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill #import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object #import "../definicije.typ": file-object, tree-object, commit-object
#diagram(node-stroke: 0.5pt, #diagram(node-stroke: 0.5pt,
{ {

View file

@ -1,6 +1,6 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill #import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object #import "../definicije.typ": file-object, tree-object, commit-object
#diagram(node-stroke: 1pt, node-shape: pill, #diagram(node-stroke: 1pt, node-shape: pill,
{ {

View file

@ -1,6 +1,6 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill #import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object, bla, blabla #import "../definicije.typ": file-object, tree-object, commit-object, bla, blabla
#diagram( #diagram(
{ {

View file

@ -1,6 +1,6 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill #import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object #import "../definicije.typ": file-object, tree-object, commit-object
#diagram(node-stroke: 0.5pt, #diagram(node-stroke: 0.5pt,
{ {

View file

@ -1,6 +1,6 @@
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
#import fletcher.shapes: house, chevron, pill #import fletcher.shapes: house, chevron, pill
#import "../definicije.typ": file-object, tree-object, git-object, commit-object, bla, blabla #import "../definicije.typ": file-object, tree-object, commit-object, bla, blabla
#diagram( #diagram(
{ {

View file

@ -4,9 +4,7 @@
#show heading: block.with(below: 1.5em) #show heading: block.with(below: 1.5em)
#set text(lang: "sl") #set text(lang: "sl")
#show link: set text(blue) #show link: set text(blue)
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #let git-object(hash, content) = table(columns: 1, [Zgoščena vrednost: #raw(hash)], raw(block:true, content))
#import fletcher.shapes: house, chevron, pill
#import "definicije.typ": file-object, tree-object, git-object, commit-object
#let note(content) = rect(stroke: none, width: 100%, #let note(content) = rect(stroke: none, width: 100%,
text(style: "italic", text(style: "italic",
@ -18,7 +16,7 @@
#align(center)[ #align(center)[
#text(size:2em)[*Matematika v Gitu*] #text(size:2em)[*Matematični pogled na Git*]
#v(2em) #v(2em)
Martin Vuk Martin Vuk
] ]
@ -59,12 +57,12 @@ Zato je Git #link("https://en.wikipedia.org/wiki/Distributed_version_control")[d
] ]
V nadaljevanju bomo obravnavali nasledjne teme: V nadaljevanju bomo obravnavali nasledjne teme:
- _Podatkovno skladišče:_ Kako Git uporablja #link("https://sl.wikipedia.org/wiki/Zgo%C5%A1%C4%8Devalna_funkcija")[zgoščevalno funkcijo] - _Podatkovno skladišče:_ Kako Git uporablja #link("https://sl.wikipedia.org/wiki/Zgo%C5%A1%C4%8Devalna_funkcija")[zgoščevalno funkcijo] (angl. hash function)?
in #link("https://en.wikipedia.org/wiki/Merkle_tree")[Merklejeva drevesa] za hranjenje posnetkov vsebine mape. in #link("https://en.wikipedia.org/wiki/Merkle_tree")[Merklejeva drevesa] za hranjenje posnetkov vsebine mape.
- _Zgodovina sprememb:_ Kako zgodovino predstavimo z #link("https://en.wikipedia.org/wiki/Directed_acyclic_graph")[usmerjenim acikličnim grafom], - _Zgodovina sprememb:_ Kako zgodovino predstavimo z #link("https://en.wikipedia.org/wiki/Directed_acyclic_graph")[usmerjenim acikličnim grafom],
v katerem so vozlišča različice, povezave pa povežejo različice z njihovimi neposrednimi predhodniki. v katerem so vozlišča različice, povezave pa povežejo različice z njihovimi neposrednimi predhodniki?
- _Reference_: Kako preproste reference (kazalci) na vsebino omogočajo bliskovito - _Reference_: Kako preproste reference (kazalci) na vsebino omogočajo bliskovito
preklaplanje med različicami in preprečijo popolno zmešnjavo, ko več ljudi hkrati spreminja iste datoteke. preklaplanje med različicami in preprečijo popolno zmešnjavo, ko več ljudi hkrati spreminja iste datoteke?
= Podatkovno skladišče = Podatkovno skladišče
@ -84,7 +82,7 @@ Git za izračun imena uporabi _zgoščevalno funkcijo_. Naj bo $B$ množica vseh
$ $
H: B -> {0, 1, dots, 2^(n)-1}, H: B -> {0, 1, dots, 2^(n)-1},
$ $
ki vsakemu besedilu $b$ priredi $n$-bitno vrednost $H(b)$. Vrednosti zgoščevalne funkcije $H(b)$ pravimo _zgostitev_ vsebine $b$. ki vsakemu besedilu $b$ priredi $n$-bitno vrednost $H(b)$. Vrednosti zgoščevalne funkcije $H(b)$ pravimo _zgostitev_ vsebine $b$ (angl. hash).
Git hrani datoteke pod imeni, ki so enaka zgostitvi vsebine. Kaj pa če imata dve različni vsebini isto zgostitev? Funkcija $H$ ni injektivna, saj je množica nizov, bistveno večja od množice zgostitev. To pomeni, da imata lahko dve različni datoteki enako zgostitev. Če se to zgodi, rečemo, da pride do _kolizije zgostitve_. V primeru kolizije zgostitve bi Git shranil le eno datoteko, za drugo pa bi predpostavil da je že shranjena. Zato je funkcija $H$ izbrana tako, da Git hrani datoteke pod imeni, ki so enaka zgostitvi vsebine. Kaj pa če imata dve različni vsebini isto zgostitev? Funkcija $H$ ni injektivna, saj je množica nizov, bistveno večja od množice zgostitev. To pomeni, da imata lahko dve različni datoteki enako zgostitev. Če se to zgodi, rečemo, da pride do _kolizije zgostitve_. V primeru kolizije zgostitve bi Git shranil le eno datoteko, za drugo pa bi predpostavil da je že shranjena. Zato je funkcija $H$ izbrana tako, da
sprememba enega samega bita v besedilu $b in B$ spremeni vrednost $H(b)$ in je porazdelitev vrednosti $H(b)$ čim bližje enakomerni porazdelitvi. To pomeni, da so vse vrednosti $H(b)$ približno enako verjetne. Na ta način zmanjšamo verjetnost kolizije( glej @sec_kolizije). Verjetnost kolizije je izjemno majhna, zato Git lahko predpostavi, da je niz $b$ enolično določen z njegovo zgostitvijo $H(b)$. sprememba enega samega bita v besedilu $b in B$ spremeni vrednost $H(b)$ in je porazdelitev vrednosti $H(b)$ čim bližje enakomerni porazdelitvi. To pomeni, da so vse vrednosti $H(b)$ približno enako verjetne. Na ta način zmanjšamo verjetnost kolizije( glej @sec_kolizije). Verjetnost kolizije je izjemno majhna, zato Git lahko predpostavi, da je niz $b$ enolično določen z njegovo zgostitvijo $H(b)$.