Trying to get a HashCode for a simple list of custom POCO'sHow to get first N elements of a list in C#?Implementing `hashCode()` for very simple classesHow to get the list of properties of a class?How to get the unique ID of an object which overrides hashCode()?How to get a list of properties with a given attribute?HashCode, trying to get the last couple letters of a word or numberUse LINQ to get items in one List<>, that are not in another List<>How likely is it to get a HashCode collision with this hashcode function?Getting a list item by indexGenerating hashCode() for a custom class
Is there a reason why Turkey took the Balkan territories of the Ottoman Empire, instead of Greece or another of the Balkan states?
If quadruped mammals evolve to become bipedal will their breast or nipple change position?
What is the Ancient One's mistake?
How to increase speed on my hybrid bike with flat handlebars and 700X35C tyres?
Crime rates in a post-scarcity economy
What calendar would the Saturn nation use?
Select list elements based on other list
How do I minimise waste on a flight?
Why always 4...dxc6 and not 4...bxc6 in the Ruy Lopez Exchange?
Can a player choose to add detail and flavor to their character's spells and abilities?
Translation of "invincible independence"
Why doesn't a particle exert force on itself?
Bash prompt takes only the first word of a hostname before the dot
Does this website provide consistent translation into Wookiee?
What does the copyright in a dissertation protect exactly?
A♭ major 9th chord in Bach is unexpectedly dissonant/jazzy
Are modes in jazz primarily a melody thing?
Did any early RISC OS precursor run on the BBC Micro?
What's weird about Proto-Indo-European Stops?
Why did Gendry call himself Gendry Rivers?
Do the Zhentarim fire members for killing fellow members?
In a series of books, what happens after the coming of age?
How to get the decimal part of a number in apex
What's the difference between "ricochet" and "bounce"?
Trying to get a HashCode for a simple list of custom POCO's
How to get first N elements of a list in C#?Implementing `hashCode()` for very simple classesHow to get the list of properties of a class?How to get the unique ID of an object which overrides hashCode()?How to get a list of properties with a given attribute?HashCode, trying to get the last couple letters of a word or numberUse LINQ to get items in one List<>, that are not in another List<>How likely is it to get a HashCode collision with this hashcode function?Getting a list item by indexGenerating hashCode() for a custom class
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I'm trying to create a simple HashCode of a list of weather results (custom POCO's) and would like to know if what I'm doing is ok/fine.
I have a time based process that checks the weather results for a 5 locations. I store each weather result in a List:
"results": [
"Id": 1,
"Location": "New York City",
"Temp": "21.7",
"Metric": "Celsius"
,
"Id": 2,
"Location": "San Francisco",
"Temp": "18.1",
"Metric": "Celsius"
,
....
"Id": 5,
"Location": "Melbourne",
"Temp": "33.1",
"Metric": "Celsius"
]
So I wish to get a HashCode / unique fingerprint .. store this in a db. Later on, I'll grab the latest weather results again ... and this time compare this most recent result against the previous result (in the db).
To do this, I'm doing the following:
private static string ToHash(IEnumerable<Weather> weatherResults)
byte[] hash;
// MD5 or SHA256?
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Encoding.UTF8.GetString(hash);
- So i'm using
MD5
because I don't care about security (eg. this isn't passwords we're storing) and would like this to be fast. - I'm converting the list to JSON as an easy way to get a standard text representation of my weather list. (simple serialization)
When I do the code (above) I get some weird text results ... here's a snapshot:
So the code seems to generate some textual representation of my lists. I can store this text into the db.
So it feels like, what I'm doing is ok -> I would just like someone to confirm if the steps I'm doing are fine.
c# .net hashcode
add a comment |
I'm trying to create a simple HashCode of a list of weather results (custom POCO's) and would like to know if what I'm doing is ok/fine.
I have a time based process that checks the weather results for a 5 locations. I store each weather result in a List:
"results": [
"Id": 1,
"Location": "New York City",
"Temp": "21.7",
"Metric": "Celsius"
,
"Id": 2,
"Location": "San Francisco",
"Temp": "18.1",
"Metric": "Celsius"
,
....
"Id": 5,
"Location": "Melbourne",
"Temp": "33.1",
"Metric": "Celsius"
]
So I wish to get a HashCode / unique fingerprint .. store this in a db. Later on, I'll grab the latest weather results again ... and this time compare this most recent result against the previous result (in the db).
To do this, I'm doing the following:
private static string ToHash(IEnumerable<Weather> weatherResults)
byte[] hash;
// MD5 or SHA256?
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Encoding.UTF8.GetString(hash);
- So i'm using
MD5
because I don't care about security (eg. this isn't passwords we're storing) and would like this to be fast. - I'm converting the list to JSON as an easy way to get a standard text representation of my weather list. (simple serialization)
When I do the code (above) I get some weird text results ... here's a snapshot:
So the code seems to generate some textual representation of my lists. I can store this text into the db.
So it feels like, what I'm doing is ok -> I would just like someone to confirm if the steps I'm doing are fine.
c# .net hashcode
add a comment |
I'm trying to create a simple HashCode of a list of weather results (custom POCO's) and would like to know if what I'm doing is ok/fine.
I have a time based process that checks the weather results for a 5 locations. I store each weather result in a List:
"results": [
"Id": 1,
"Location": "New York City",
"Temp": "21.7",
"Metric": "Celsius"
,
"Id": 2,
"Location": "San Francisco",
"Temp": "18.1",
"Metric": "Celsius"
,
....
"Id": 5,
"Location": "Melbourne",
"Temp": "33.1",
"Metric": "Celsius"
]
So I wish to get a HashCode / unique fingerprint .. store this in a db. Later on, I'll grab the latest weather results again ... and this time compare this most recent result against the previous result (in the db).
To do this, I'm doing the following:
private static string ToHash(IEnumerable<Weather> weatherResults)
byte[] hash;
// MD5 or SHA256?
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Encoding.UTF8.GetString(hash);
- So i'm using
MD5
because I don't care about security (eg. this isn't passwords we're storing) and would like this to be fast. - I'm converting the list to JSON as an easy way to get a standard text representation of my weather list. (simple serialization)
When I do the code (above) I get some weird text results ... here's a snapshot:
So the code seems to generate some textual representation of my lists. I can store this text into the db.
So it feels like, what I'm doing is ok -> I would just like someone to confirm if the steps I'm doing are fine.
c# .net hashcode
I'm trying to create a simple HashCode of a list of weather results (custom POCO's) and would like to know if what I'm doing is ok/fine.
I have a time based process that checks the weather results for a 5 locations. I store each weather result in a List:
"results": [
"Id": 1,
"Location": "New York City",
"Temp": "21.7",
"Metric": "Celsius"
,
"Id": 2,
"Location": "San Francisco",
"Temp": "18.1",
"Metric": "Celsius"
,
....
"Id": 5,
"Location": "Melbourne",
"Temp": "33.1",
"Metric": "Celsius"
]
So I wish to get a HashCode / unique fingerprint .. store this in a db. Later on, I'll grab the latest weather results again ... and this time compare this most recent result against the previous result (in the db).
To do this, I'm doing the following:
private static string ToHash(IEnumerable<Weather> weatherResults)
byte[] hash;
// MD5 or SHA256?
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Encoding.UTF8.GetString(hash);
- So i'm using
MD5
because I don't care about security (eg. this isn't passwords we're storing) and would like this to be fast. - I'm converting the list to JSON as an easy way to get a standard text representation of my weather list. (simple serialization)
When I do the code (above) I get some weird text results ... here's a snapshot:
So the code seems to generate some textual representation of my lists. I can store this text into the db.
So it feels like, what I'm doing is ok -> I would just like someone to confirm if the steps I'm doing are fine.
c# .net hashcode
c# .net hashcode
asked Mar 23 at 6:15
Pure.KromePure.Krome
45.6k92324532
45.6k92324532
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
When I do the code (above) I get some weird text results
That's because you're treating arbitrary binary data (a cryptographic hash) as if it's UTF-8-encoded text data. It's like trying to open a JPG file in Notepad - you'll see garbage, because a JPG file isn't a text file.
If you want printable text, you should convert to hex or base64. Base64 is probably the simplest:
return Convert.ToBase64String(hash);
Note that if you put the return statement inside the using
statement you don't even need the extra local variable:
private static string ToHash(IEnumerable<Weather> weatherResults)
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Convert.ToBase64String(hash);
This personally feels somewhat brittle though - it's relying on the precise JSON representation of the POCO. In particular, if you were to change some aspect of serialization, e.g. changing the field names in the JSON, then the hash would change even if the data didn't, which may not be what you want. As another example, suppose you add an int
field to your POCO - the JSON representation of all your existing data would change to include that value even if it's 0, so all the hashes would change.
(It's also quite an inefficient way of hashing data, but that may well not be important.)
This may all be fine for you, but you need to consider your requirements as your data type evolves.
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55311143%2ftrying-to-get-a-hashcode-for-a-simple-list-of-custom-pocos%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
When I do the code (above) I get some weird text results
That's because you're treating arbitrary binary data (a cryptographic hash) as if it's UTF-8-encoded text data. It's like trying to open a JPG file in Notepad - you'll see garbage, because a JPG file isn't a text file.
If you want printable text, you should convert to hex or base64. Base64 is probably the simplest:
return Convert.ToBase64String(hash);
Note that if you put the return statement inside the using
statement you don't even need the extra local variable:
private static string ToHash(IEnumerable<Weather> weatherResults)
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Convert.ToBase64String(hash);
This personally feels somewhat brittle though - it's relying on the precise JSON representation of the POCO. In particular, if you were to change some aspect of serialization, e.g. changing the field names in the JSON, then the hash would change even if the data didn't, which may not be what you want. As another example, suppose you add an int
field to your POCO - the JSON representation of all your existing data would change to include that value even if it's 0, so all the hashes would change.
(It's also quite an inefficient way of hashing data, but that may well not be important.)
This may all be fine for you, but you need to consider your requirements as your data type evolves.
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
add a comment |
When I do the code (above) I get some weird text results
That's because you're treating arbitrary binary data (a cryptographic hash) as if it's UTF-8-encoded text data. It's like trying to open a JPG file in Notepad - you'll see garbage, because a JPG file isn't a text file.
If you want printable text, you should convert to hex or base64. Base64 is probably the simplest:
return Convert.ToBase64String(hash);
Note that if you put the return statement inside the using
statement you don't even need the extra local variable:
private static string ToHash(IEnumerable<Weather> weatherResults)
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Convert.ToBase64String(hash);
This personally feels somewhat brittle though - it's relying on the precise JSON representation of the POCO. In particular, if you were to change some aspect of serialization, e.g. changing the field names in the JSON, then the hash would change even if the data didn't, which may not be what you want. As another example, suppose you add an int
field to your POCO - the JSON representation of all your existing data would change to include that value even if it's 0, so all the hashes would change.
(It's also quite an inefficient way of hashing data, but that may well not be important.)
This may all be fine for you, but you need to consider your requirements as your data type evolves.
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
add a comment |
When I do the code (above) I get some weird text results
That's because you're treating arbitrary binary data (a cryptographic hash) as if it's UTF-8-encoded text data. It's like trying to open a JPG file in Notepad - you'll see garbage, because a JPG file isn't a text file.
If you want printable text, you should convert to hex or base64. Base64 is probably the simplest:
return Convert.ToBase64String(hash);
Note that if you put the return statement inside the using
statement you don't even need the extra local variable:
private static string ToHash(IEnumerable<Weather> weatherResults)
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Convert.ToBase64String(hash);
This personally feels somewhat brittle though - it's relying on the precise JSON representation of the POCO. In particular, if you were to change some aspect of serialization, e.g. changing the field names in the JSON, then the hash would change even if the data didn't, which may not be what you want. As another example, suppose you add an int
field to your POCO - the JSON representation of all your existing data would change to include that value even if it's 0, so all the hashes would change.
(It's also quite an inefficient way of hashing data, but that may well not be important.)
This may all be fine for you, but you need to consider your requirements as your data type evolves.
When I do the code (above) I get some weird text results
That's because you're treating arbitrary binary data (a cryptographic hash) as if it's UTF-8-encoded text data. It's like trying to open a JPG file in Notepad - you'll see garbage, because a JPG file isn't a text file.
If you want printable text, you should convert to hex or base64. Base64 is probably the simplest:
return Convert.ToBase64String(hash);
Note that if you put the return statement inside the using
statement you don't even need the extra local variable:
private static string ToHash(IEnumerable<Weather> weatherResults)
using (var algorithm = MD5.Create())
var json = JsonConvert.SerializeObject(weatherResults);
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(json));
return Convert.ToBase64String(hash);
This personally feels somewhat brittle though - it's relying on the precise JSON representation of the POCO. In particular, if you were to change some aspect of serialization, e.g. changing the field names in the JSON, then the hash would change even if the data didn't, which may not be what you want. As another example, suppose you add an int
field to your POCO - the JSON representation of all your existing data would change to include that value even if it's 0, so all the hashes would change.
(It's also quite an inefficient way of hashing data, but that may well not be important.)
This may all be fine for you, but you need to consider your requirements as your data type evolves.
answered Mar 23 at 6:46
Jon SkeetJon Skeet
1104k70380338498
1104k70380338498
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
add a comment |
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
Thank you Jon for your thoughts and suggestions. Given the warnings, I'm not sure what other options I should consider? For example, serializing as JSON is brittle (fields change, serialization format changes, etc) ... so instead of JSON ... what else could I use? Secondly, you said that this is an inefficient way of hashing. What other suggestions would you suggest for a more efficient way. Security is not an issue (it's not a password). Again - thank you again for you help!
– Pure.Krome
Mar 23 at 7:15
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
@Pure.Krome: I can't really offer an answer without knowing more requirements - that's the thing you need to think about. How do you expect the data model to evolve, and how does that affect how you use the hashes? (For example, if you're happy to rehash the data if the model changes, that may be fine.) How important is performance? Lots of questions to think about - and I'm not inviting answers in comments here; once you've thought about this carefully, it may be worth asking a new question with all the details.
– Jon Skeet
Mar 23 at 7:57
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
Thanks @jonskeet - really appreciated the feedback - cheers!
– Pure.Krome
Mar 23 at 10:38
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55311143%2ftrying-to-get-a-hashcode-for-a-simple-list-of-custom-pocos%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown