Smoke Testing Vs Sanity Testing

This is one of the frequently asked question during interviews.

Smoke
Sanity
Smoke testing originated in the hardware testing practice of turning on a new piece of hardware for the first time and considering it a success if it does not catch fire and smoke. In software industry, smoke testing is a shallow and wide approach whereby all areas of the application without getting into too deep, is tested. A sanity test is a narrow regression test that focuses on one or a few areas of functionality. Sanity testing is usually narrow and deep.
A smoke test is scripted--either using a written set of tests or an automated test. A sanity test is usually unscripted.
A Smoke test is designed to touch every part of the application in a cursory way. It's is shallow and wide. A Sanity test is used to determine a small section of the application is still working after a minor change.
Smoke testing will be conducted to ensure whether the most crucial functions of a program work, but not bothering with finer details. (Such as build verification). Sanity testing is a cursory testing; it is performed whenever a cursory testing is sufficient to prove the application is functioning according to specifications. This level of testing is a subset of regression testing.
Smoke testing is normal health check up to a build of an application before taking it to testing in depth. Sanity testing is to verify whether requirements are met or not, checking all features breadth-first.
Smoke testing is after build releasing we will test high level functionalities working or not. Sanity testing is we will test all functionalities working properly or not.
It covers the major functionality of the application without bothering with finer details. Tester conducts the Sanity test to ensure the stability of the application build. Tester finds weather the application builds is stable for complete application or not.