मैं आर का उपयोग कर फ़ाइल का sha1 योग बनाना चाहता हूं।
मेरा सिस्टम विंडोज 10 है जो RStudio 1.4 चला रहा है।
यह काम:
md5sum <- md5sum(file)
यह नहीं:
sha1sum <- sha1sum(file)
"फ़ंक्शन sha1sum नहीं मिला"
2 जवाब
openssl::sha1
और digest::sha1
की तुलना:
writeLines("foo", "quux.txt")
system2("sha1sum", c("quux.txt"), stdout = TRUE)
# [1] "855426068ee8939df6bce2c2c4b1e7346532a133 *quux.txt"
as.character(openssl::sha1(file("quux.txt")))
# [1] "855426068ee8939df6bce2c2c4b1e7346532a133"
digest::sha1("quux.txt")
# [1] "ad1a86aea4360a7d5c5fb0265f00438f6d7664a2"
इससे समस्या दिखाई देने लगती है, एक दूसरे से असहमत होता है। क्या हो रहा है यह देखने का एक तरीका फ़ाइल की सामग्री को बदलना है लेकिन फ़ाइल नाम वही रखना है:
writeLines("foofoofoo", "quux.txt")
as.character(openssl::sha1(file("quux.txt")))
# [1] "47673505b61b548b176d3d0449d7f6a4f3e9e09e"
system2("sha1sum", c("quux.txt"), stdout = TRUE)
# [1] "47673505b61b548b176d3d0449d7f6a4f3e9e09e *quux.txt"
digest::sha1("quux.txt")
# [1] "ad1a86aea4360a7d5c5fb0265f00438f6d7664a2"
पहले दो बदल गए (यह अपेक्षित है) और वही रहेगा, लेकिन digest::sha1
से तीसरा नहीं बदला सामग्री बदलने के बावजूद। हालांकि यह सैद्धांतिक रूप से संभव है कि अलग-अलग सामग्री वाली दो फाइलें एक ही SHA1 चेकसम उत्पन्न कर सकती हैं, लेकिन ऐसा नहीं है।
BTW: आपके उपयोग के आधार पर, SHA256 या SHA512 या अन्य मजबूत हैश फ़ंक्शन को प्राथमिकता देते हुए, SHA1 को अब सुरक्षित हैशिंग के लिए अनुशंसित नहीं किया जाता है।
एक और BTW: file(.)
का उपयोग openssl::sha1
में करना न भूलें, अन्यथा आप बिल्कुल वही गलती कर रहे हैं।
writeLines("foo", "quux.txt")
openssl::sha1("quux.txt")
# [1] "08a72b849478907ae9de2ff46ba53ce6aeeba360"
as.character(openssl::sha1(file("quux.txt")))
# [1] "855426068ee8939df6bce2c2c4b1e7346532a133"
writeLines("foofoofoo", "quux.txt")
openssl::sha1("quux.txt")
# [1] "08a72b849478907ae9de2ff46ba53ce6aeeba360"
### has not changed!
as.character(openssl::sha1(file("quux.txt")))
# [1] "47673505b61b548b176d3d0449d7f6a4f3e9e09e"
इस पर सहायता दस्तावेज़ पूरी तरह से स्पष्ट नहीं हो सकता है। ?openssl::sha1
से:
x: character vector, raw vector or connection object.
तथ्य यह है कि यह एक स्ट्रिंग या फ़ाइल पर काम करता है बहुरूपता है ... और जितना सुविधाजनक हो सकता है, यह क्या हो रहा है की गलतफहमी के लिए भी (अक्सर!) का नेतृत्व कर सकता है। यदि आप इसके बारे में सोचते हैं, तो फ़ंक्शन को कैसे पता चलता है कि आप जो खोज रहे हैं वह एक फ़ाइल होने का इरादा है? यदि यह file.exists
से जांचता है कि यह मौजूद है, तो यह आपको फ़ाइल की सामग्री का चेकसम देगा; यदि नहीं, तो स्ट्रिंग का चेकसम। यदि आप कोड चलाते हैं और उम्मीद करते हैं कि यह एक फ़ाइल की जांच करेगा और फ़ाइल मौजूद नहीं है, तो मैं एक त्रुटि की उम्मीद करूंगा, लेकिन स्ट्रिंग के चेकसम को वापस करना जो आपने सोचा था कि एक फ़ाइल थी और फ़ंक्शन ने सोचा था एक स्ट्रिंग थी ... आपके उपयोग-मामले में कई धारणाओं को तोड़ देगा। (मेरा सुझाव है कि वे text=
और file=
या con=
जैसे स्पष्ट तर्कों का उपयोग करें।)
फ़ाइल के sha1 हैश प्राप्त करने के लिए RStudio में सबसे आसान तरीका:
sha1sum <- as.character(openssl::sha1(file("filename.ext")))