Fossil SCM

Expand the /hash-collisions report to show hash prefix collisions on just check-ins in addition to overall hash collisions.

drh 2015-05-14 18:25 UTC trunk
Commit 60af05741590fa9829b321641f4620aa87a0ba4d
1 file changed +29 -10
+29 -10
--- src/name.c
+++ src/name.c
@@ -1068,29 +1068,26 @@
10681068
10691069
/* Maximum number of collision examples to remember */
10701070
#define MAX_COLLIDE 25
10711071
10721072
/*
1073
-** WEBPAGE: hash-collisions
1074
-**
1075
-** Show the number of hash collisions for hash prefixes of various lengths.
1073
+** Generate a report on the number of collisions in SHA1 hashes
1074
+** generated by the SQL given in the argument.
10761075
*/
1077
-void hash_collisions_webpage(void){
1076
+static void collision_report(const char *zSql){
10781077
int i, j, kk;
10791078
int nHash = 0;
10801079
Stmt q;
10811080
char zPrev[UUID_SIZE+1];
10821081
struct {
10831082
int cnt;
10841083
char *azHit[MAX_COLLIDE];
10851084
char z[UUID_SIZE+1];
10861085
} aCollide[UUID_SIZE+1];
1087
- login_check_credentials();
1088
- if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
10891086
memset(aCollide, 0, sizeof(aCollide));
10901087
memset(zPrev, 0, sizeof(zPrev));
1091
- db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1");
1088
+ db_prepare(&q,"%s",zSql/*safe-for-%s*/);
10921089
while( db_step(&q)==SQLITE_ROW ){
10931090
const char *zUuid = db_column_text(&q,0);
10941091
int n = db_column_bytes(&q,0);
10951092
int i;
10961093
nHash++;
@@ -1103,13 +1100,10 @@
11031100
if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1);
11041101
}
11051102
memcpy(zPrev, zUuid, n+1);
11061103
}
11071104
db_finalize(&q);
1108
- style_header("SHA1 Prefix Collisions");
1109
- style_submenu_element("Activity Reports", 0, "reports");
1110
- style_submenu_element("Stats", 0, "stat");
11111105
@ <table border=1><thead>
11121106
@ <tr><th>Length<th>Instances<th>First Instance</tr>
11131107
@ </thead><tbody>
11141108
for(i=1; i<=UUID_SIZE; i++){
11151109
if( aCollide[i].cnt==0 ) continue;
@@ -1131,7 +1125,32 @@
11311125
char *zId = aCollide[i].azHit[j];
11321126
if( zId==0 ) continue;
11331127
@ %z(href("%R/whatis/%s",zId))%h(zId)</a>
11341128
}
11351129
}
1130
+ for(i=4; i<ArraySize(aCollide); i++){
1131
+ for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){
1132
+ fossil_free(aCollide[i].azHit[j]);
1133
+ }
1134
+ }
1135
+}
1136
+
1137
+/*
1138
+** WEBPAGE: hash-collisions
1139
+**
1140
+** Show the number of hash collisions for hash prefixes of various lengths.
1141
+*/
1142
+void hash_collisions_webpage(void){
1143
+ Stmt q;
1144
+ login_check_credentials();
1145
+ if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
1146
+ style_header("SHA1 Prefix Collisions");
1147
+ style_submenu_element("Activity Reports", 0, "reports");
1148
+ style_submenu_element("Stats", 0, "stat");
1149
+ @ <h1>Hash Prefix Collisions on Check-ins</h1>
1150
+ collision_report("SELECT (SELECT uuid FROM blob WHERE rid=objid)"
1151
+ " FROM event WHERE event.type='ci'"
1152
+ " ORDER BY 1");
1153
+ @ <h1>Hash Prefix Collisions on All Artifacts</h1>
1154
+ collision_report("SELECT uuid FROM blob ORDER BY 1");
11361155
style_footer();
11371156
}
11381157
--- src/name.c
+++ src/name.c
@@ -1068,29 +1068,26 @@
1068
1069 /* Maximum number of collision examples to remember */
1070 #define MAX_COLLIDE 25
1071
1072 /*
1073 ** WEBPAGE: hash-collisions
1074 **
1075 ** Show the number of hash collisions for hash prefixes of various lengths.
1076 */
1077 void hash_collisions_webpage(void){
1078 int i, j, kk;
1079 int nHash = 0;
1080 Stmt q;
1081 char zPrev[UUID_SIZE+1];
1082 struct {
1083 int cnt;
1084 char *azHit[MAX_COLLIDE];
1085 char z[UUID_SIZE+1];
1086 } aCollide[UUID_SIZE+1];
1087 login_check_credentials();
1088 if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
1089 memset(aCollide, 0, sizeof(aCollide));
1090 memset(zPrev, 0, sizeof(zPrev));
1091 db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1");
1092 while( db_step(&q)==SQLITE_ROW ){
1093 const char *zUuid = db_column_text(&q,0);
1094 int n = db_column_bytes(&q,0);
1095 int i;
1096 nHash++;
@@ -1103,13 +1100,10 @@
1103 if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1);
1104 }
1105 memcpy(zPrev, zUuid, n+1);
1106 }
1107 db_finalize(&q);
1108 style_header("SHA1 Prefix Collisions");
1109 style_submenu_element("Activity Reports", 0, "reports");
1110 style_submenu_element("Stats", 0, "stat");
1111 @ <table border=1><thead>
1112 @ <tr><th>Length<th>Instances<th>First Instance</tr>
1113 @ </thead><tbody>
1114 for(i=1; i<=UUID_SIZE; i++){
1115 if( aCollide[i].cnt==0 ) continue;
@@ -1131,7 +1125,32 @@
1131 char *zId = aCollide[i].azHit[j];
1132 if( zId==0 ) continue;
1133 @ %z(href("%R/whatis/%s",zId))%h(zId)</a>
1134 }
1135 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1136 style_footer();
1137 }
1138
--- src/name.c
+++ src/name.c
@@ -1068,29 +1068,26 @@
1068
1069 /* Maximum number of collision examples to remember */
1070 #define MAX_COLLIDE 25
1071
1072 /*
1073 ** Generate a report on the number of collisions in SHA1 hashes
1074 ** generated by the SQL given in the argument.
 
1075 */
1076 static void collision_report(const char *zSql){
1077 int i, j, kk;
1078 int nHash = 0;
1079 Stmt q;
1080 char zPrev[UUID_SIZE+1];
1081 struct {
1082 int cnt;
1083 char *azHit[MAX_COLLIDE];
1084 char z[UUID_SIZE+1];
1085 } aCollide[UUID_SIZE+1];
 
 
1086 memset(aCollide, 0, sizeof(aCollide));
1087 memset(zPrev, 0, sizeof(zPrev));
1088 db_prepare(&q,"%s",zSql/*safe-for-%s*/);
1089 while( db_step(&q)==SQLITE_ROW ){
1090 const char *zUuid = db_column_text(&q,0);
1091 int n = db_column_bytes(&q,0);
1092 int i;
1093 nHash++;
@@ -1103,13 +1100,10 @@
1100 if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1);
1101 }
1102 memcpy(zPrev, zUuid, n+1);
1103 }
1104 db_finalize(&q);
 
 
 
1105 @ <table border=1><thead>
1106 @ <tr><th>Length<th>Instances<th>First Instance</tr>
1107 @ </thead><tbody>
1108 for(i=1; i<=UUID_SIZE; i++){
1109 if( aCollide[i].cnt==0 ) continue;
@@ -1131,7 +1125,32 @@
1125 char *zId = aCollide[i].azHit[j];
1126 if( zId==0 ) continue;
1127 @ %z(href("%R/whatis/%s",zId))%h(zId)</a>
1128 }
1129 }
1130 for(i=4; i<ArraySize(aCollide); i++){
1131 for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){
1132 fossil_free(aCollide[i].azHit[j]);
1133 }
1134 }
1135 }
1136
1137 /*
1138 ** WEBPAGE: hash-collisions
1139 **
1140 ** Show the number of hash collisions for hash prefixes of various lengths.
1141 */
1142 void hash_collisions_webpage(void){
1143 Stmt q;
1144 login_check_credentials();
1145 if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
1146 style_header("SHA1 Prefix Collisions");
1147 style_submenu_element("Activity Reports", 0, "reports");
1148 style_submenu_element("Stats", 0, "stat");
1149 @ <h1>Hash Prefix Collisions on Check-ins</h1>
1150 collision_report("SELECT (SELECT uuid FROM blob WHERE rid=objid)"
1151 " FROM event WHERE event.type='ci'"
1152 " ORDER BY 1");
1153 @ <h1>Hash Prefix Collisions on All Artifacts</h1>
1154 collision_report("SELECT uuid FROM blob ORDER BY 1");
1155 style_footer();
1156 }
1157

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button